分析:
在Z字形扫描中,共有4种移动方向:向右、向左下、向下以及向右上。
扫描的第一步向右走,接下来按照如下规则移动:
1.当前向右移动。若碰到下边界,则下一步向右上方走;否则,下一步向左下方走。
2.当前向左下方移动。若碰到下边界,则下一步向右走;若碰到左边界,则下一步向下走;否则,继续向左下方走。
3.当前向下移动。若碰到右边界,则下一步向左下方走;否则,下一步向右上方走。
4.当前向右上方移动。若碰到右边界,则下一步向下走;若碰到上边界,则下一步向右走;否则,继续向右上方移动。
将问题分解,一共是四个方向上的移动,对移动的每一步进行考虑,考虑多步的话会将问题复杂化,每一次都重新考虑下一步的移动方向,这是至关重要的
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int a[n][n];
int b[n * n];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> a[i][j];
int num = 1;
//下一步移动的方向:1 右 2 左下 3 下 4 右上
int point = 0, i = 0, j = 0;
while (i < n && j < n) {
b[point++] = a[i][j];
if (num == 1) {
j++;
if (i == n - 1)
num = 4;
else
num = 2;
} else if (num == 2) {
i++;
j--;
if (i == n - 1)
num = 1;
else if (j == 0)
num = 3;
} else if (num == 3) {
i++;
if (j == n - 1)
num = 2;
else
num = 4;
} else if (num == 4) {
j++;
i--;
if (j == n - 1)
num = 3;
else if (i == 0)
num = 1;
}
}
for (int i = 0; i < n * n; i++)
cout << b[i] << " ";
return 0;
}