模拟
根据题意,其实就是将对角线输出
如图,Z字形输出就是将对角线依次输出,那么,如何遍历所有的对角线?
我的做法是去枚举每条对角线的一个端点(即红点)。但是,对角线是按右上、左下、右上、左下…
这样的顺序输出的,我每次取的是每条对角线右上的端点。
- 从右上到左下的顺序:顺序输出即可
- 从左下到右上的顺序:逆序输出
正序和逆序输出,差别在于递归函数中输出语句的顺序
#include<iostream>
using namespace std;
const int N = 510;
int n, d[N][N];
// 正序输出
void p1(int x, int y) {
if(x > n || y < 1) return;
cout << d[x][y] << ' ';
p1(x + 1, y - 1);
}
// 逆序输出
void p2(int x, int y) {
if(x > n || y < 1) return;
p2(x + 1, y - 1);
cout << d[x][y] << ' ';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) cin >> d[i][j];
}
for(int i = 1; i < 2 * n; ++i) {
int x, y;
if(i <= n) x = 1, y = i;
else x = 1 + i - n, y = n;
if(i & 1) p2(x, y); // i为奇数说明是逆序输出,否则正序输出
else p1(x, y);
}
return 0;
}