AcWing 3208. Z字形扫描(模拟)

【题目描述】
在图像编码的算法中,需要将一个给定的方形矩阵进行 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字形扫描的过程如下图所示:

AcWing 3208. 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;
}
上一篇:42岁程序员面试,在百度等大厂呆过,工资却只敢要一万六,心酸


下一篇:[Acwing] 字符串哈希 模板