一个矩阵一共有 $2n-1$ 条对角线
把对角线分成两类 右上和左下
对于每一条对角线 都有 $x + y = C1 \quad x - y = C2$
也就是说 对角线的坐标之差/坐标之和是固定的
因此可以利用这个关系来算坐标
最后判断一下边界即可
代码有注释
/*
一个矩阵一共有2n-1条对角线
把对角线分成两类 右上和左下
对于每一条对角线 都有x + y = C1 x - y = C2
也就是说 对角线的坐标之差/坐标之和是固定的
因此可以利用这个关系来算坐标
*/
#include<iostream>
using namespace std;
const int N = 505;
int a[N][N];
int main() {
int n; cin >> n;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
cin >> a[i][j];
// 对角线个数
int len = n << 1;
// 循环2n - 1 次
for (int i = 0; i < len; ++i) {
// 从第0条开始 第0条是右上
// 因此偶数右上 奇数左下
if (i & 1) {
// 奇数左下
for (int j = 0; j <= i; ++j) {
// 判断边界
if (j >= 0 && j < n && i - j >= 0 && i - j < n)
cout << a[j][i - j] << ' ';
}
} else {
// 偶数右上
for (int j = i; ~j; --j) {
// 判断边界
if (j >= 0 && j < n && i - j >= 0 && i - j < n)
cout << a[j][i - j] << ' ';
}
}
}
return 0;
}