【题目描述】
在图像编码的算法中,需要将一个给定的方形矩阵进行
Z
Z
Z字形扫描
(
Z
i
g
z
a
g
S
c
a
n
)
(Zigzag\ Scan)
(Zigzag Scan)。
给定一个
n
×
n
n×n
n×n的矩阵,
Z
Z
Z字形扫描的过程如下图所示:
对于下面的 4 × 4 4×4 4×4的矩阵,
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
对其进行
Z
Z
Z字形扫描后得到长度为
16
16
16的序列:1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
。
请实现一个
Z
Z
Z字形扫描的程序,给定一个
n
×
n
n×n
n×n的矩阵,输出对这个矩阵进行
Z
Z
Z字形扫描的结果。
【输入格式】
输入的第一行包含一个整数
n
n
n,表示矩阵的大小。
输入的第二行到第
n
+
1
n+1
n+1行每行包含
n
n
n个正整数,由空格分隔,表示给定的矩阵。
【输出格式】
输出一行,包含
n
×
n
n×n
n×n个整数,由空格分隔,表示输入的矩阵经过
Z
Z
Z字形扫描后的结果。
【数据范围】
1
≤
n
≤
500
1≤n≤500
1≤n≤500
矩阵元素为不超过
1000
1000
1000的正整数。
【输入样例】
4
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
【输出样例】
1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
【分析】
将矩阵往右和往下各扩展一倍,然后从第一行开始枚举,枚举至第 2 n − 1 2n-1 2n−1行,如果是奇数行,那么从下往上沿对角线走,如果坐标在原矩阵内则输出元素值;如果是偶数行,那么从上往下沿对角线走,如果坐标在原矩阵内则输出元素值。
【代码】
#include <iostream>
using namespace std;
const int N = 510;
int a[N][N];
int n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
for (int i = 1; i <= 2 * n - 1; i++)//枚举1~2n-1行
if (i % 2 == 0)
for (int j = 1; j <= i; j++)//如果为偶数行那么从第一行开始往下走
if (j <= n && i - j + 1 <= n)//坐标在范围内则输出
cout << a[j][i - j + 1] << ' '; else;
else
for (int j = i; j; j--)//如果为奇数行那么从第i行开始往上走
if (j <= n && i - j + 1 <= n)//坐标在范围内则输出
cout << a[j][i - j + 1] << ' '; else;
return 0;
}