问题描述
试题编号: | 201412-2 |
试题名称: | Z字形扫描 |
时间限制: | 2.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 输入格式 输入的第一行包含一个整数n,表示矩阵的大小。 输出格式 输出一行,包含n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。 样例输入 4 样例输出 1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3 评测用例规模与约定 1≤n≤500,矩阵元素为不超过1000的正整数。 |
画说这玩意我上学期见过,就是选修课里多媒体技术里面的一个,好像是叫图像游程编码那一块的,这种Z字形扫描粗看没规律,实际就两种。一是45°斜下来扫,一是45斜上去扫。往下扫到边有2种情况,一是扫到底,那就右移;否则下移,然后执行往上扫描。往上扫描同理。
所以关键就是在扫到边界时的特殊处理,因为i++, j– 会在扫到边界后出边界,所以得把它们“拉”回来,之后往下还是往右移就看我上面说的了
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int i, j, n;
cin >> n;
int a[n+2][n+2];
int cnt = 1;
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
cin >> a[i][j];
i = j = 1;
cout << a[i][j++];
while( cnt != n*n )
{
while( i<=n && j>=1 ){
cout << " " << a[i++][j--];
cnt++;
}
--i, ++j;
if( i < n )
++i;
else
++j;
while( i>=1 && j<=n ){
cout << " " << a[i--][j++];
cnt++;
}
++i, --j;
if( j < n )
++j;
else
++i;
}
return 0;
}