分析:
這道題的難點主要是控制邊界,觀察題目給的路徑可以看出,有兩個掃描的方向,斜向上與斜向下,我這裏用類型變量存儲方向,初始點爲,方向爲斜向上,先打印出訪問的點,再嘗試着根據當前掃描的方向前進,後面個條件判斷語句分別控制掃描出錯及改正的策略。
/*
* @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;
}