算法
(无脑模拟法) $O(n^2)$
不用去想下标转换之间的关系,无非四个行走方向,右、左下、下、右上。方向转换的时候判断条件即可,有点像状态机。详见代码注释
C++ 代码
#include <iostream>
using namespace std;
const int N = 510;
int a[N][N];
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
scanf("%d", &a[i][j]);
}
}
// dir表示行走方向,0向右,1左下,2向下,3左上。
int dir = 0;
int i = 1, j = 1;
while (i <= n && j <= n) {
printf("%d ", a[i][j]);
if (dir == 0) {
j ++ ; // 向右行走
if (i == 1) dir = 1; // 在第一行,就转左下
else if (i == n) dir = 3; // 在第n行,就转右上
} else if (dir == 1) {
i ++, j -- ; // 向左下走
if (j == 1 && i < n) dir = 2; // 在第一列且不再角点(n, 1)上,转向下
else if (i == n) dir = 0; // 在最后一行上,转向右
} else if (dir == 2) {
i ++ ; // 向下走
if (j == 1) dir = 3; // 如果在第一列, 转右上
else if (j == n) dir = 1; // 如果在第n列,转左下
} else if (dir == 3) {
i -- , j ++; // 向右上走
if (i == 1 && j < n) dir = 0; // 如果在第一行非角点(1, n)上,转向右走
else if (j == n) dir = 2; // 如果在最后一列上,转向下走
}
}
return 0;
}