思路
类似于八皇后问题,我们可以知道对于每一条对角线,都有x+y=C,其中C为常数,那么由于格子是$n×n$, 总的对角线就有$2n-1$条
对于每条对角线,可以分两个方向遍历,如下:
- 左下->右上
- 右下->左上
对于每个方向,都需要设置一个坐标的起始值$(i,j)$。
以第一类对角线为例,可以先确定$i$的值,然后用$cur - i$就可以得到$j$的值。(cur是当前枚举的对角线编号)
第二类对角线类似
时间复杂度$O(n^2)$
参考leetcode498
代码
#include<iostream>
using namespace std;
const int N = 505;
int n, a[N][N];
int main()
{
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) cin >> a[i][j];
int tot = 2 * n - 1, cur = 0;
while(cur < tot)
{
//左下->右上
int i = min(n - 1, cur), j = cur - i;
while(i >= 0 && j < n)
{
cout << a[i][j] << " ";
i--, j++;
}
cur++;
if(cur >= tot) break;
//右上->左下
j = min(cur, n - 1), i = cur - j;
while(j >= 0 && i < n)
{
cout << a[i][j] << " ";
j--, i++;
}
cur++;
}
return 0;
}