分析:
这道题的难点主要是控制边界,观察题目给的路径可以看出,有两个扫描的方向,斜向上与斜向下,我这里用 e n u m enum enum类型变量存储方向,初始点为 ( 0 , 0 ) (0,0) (0,0),方向为斜向上,先打印出访问的点,再尝试着根据当前扫描的方向前进,后面 4 4 4个条件判断语句分别控制扫描出错及改正的策略。
/*
* @Descripttion:
* @version:
* @Author: iDestro
* @Date: 2020-03-19 22:40:55
* @LastEditors: iDestro
* @LastEditTime: 2020-03-20 09:51:12
*/
#include <iostream>
using namespace std;
enum {UP, DOWN} direction;
int main() {
int n;
cin >> n;
int arr[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> arr[i][j];
}
}
// cnt记录当前已经访问点的个数,i,j代表位置,默认(0,0)
int cnt = 0, i = 0, j = 0;
// 方向初始为斜向上
direction = UP;
while (cnt++ < n*n) {
// 扫描到(i,j)位置并打印
cout << arr[i][j] << " ";
// 尝试以当前方向前进
if (direction == UP) {
i--, j++;
} else {
i++, j--;
}
// 当碰到上边界
if (i < 0 && j > 0) {
if (j < n) {
i++;
} else if (j == n) { // 在矩阵副对角线上
i += 2;
j--;
}
direction = DOWN;
continue;
}
// 当碰到做边界
if (i > 0 && j < 0) {
if (i < n) {
j++;
} else if (i == n) { // 在矩阵副对角线上
i--;
j += 2;
}
direction = UP;
continue;
}
// 当碰到右边界
if (i >= 0 && j == n) {
i += 2;
j--;
direction = DOWN;
continue;
}
// 当碰到下边界
if (i == n && j >= 0) {
i--;
j += 2;
direction = UP;
continue;
}
}
return 0;
}