目录
一、题目详情
问题描述
在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:
对于下面的4×4的矩阵,
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
对其进行Z字形扫描后得到长度为16的序列:
1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。
输入格式
输入的第一行包含一个整数n,表示矩阵的大小。
输入的第二行到第n+1行每行包含n个正整数,由空格分隔,表示给定的矩阵。
输出格式
输出一行,包含n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。
样例输入
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
评测用例规模与约定
1≤n≤500,矩阵元素为不超过1000的正整数。
二、代码剖析
思路:
#include<stdio.h>
int main()
{
int n,arr[500][500]; //定义一个二维数组(1≤n≤500)
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
}
int state=1,count=0; //定义整型变量state,用来表示扫描路径的情况 ;定义整型变量count并初始化为0,用于被约束扫描的数字个数
i=0; //注意,i的值经过for循环后会发生改变,因此要重新赋值为0
j=0; //注意,j的值经过for循环后会发生改变,因此要重新赋值为0
while(count<n*n) //本部分的代码只处理转折点的情况,非转折点时,行进方向保持之前的状态不变
{
switch(state) //对接下来要扫描的位置分情况讨论,很容易发现规律(右-->左下-->下-->右上),特殊情况单论
{
case 1: //向右
printf("%d ",arr[i][j++]);
if(i==0)
state=3;
else if(i==n-1)
state=4;
break;
case 2: //向下
printf("%d ",arr[i++][j]);
if(j==0)
state=4;
else if(j==n-1)
state=3;
break;
case 3: //向左下
printf("%d ",arr[i++][j--]);
if(j==0)
state=2;
if(i==n-1)
state=1;
break;
case 4: //向右上
printf("%d ",arr[i--][j++]);
if(i==0)
state=1;
if(j==n-1)
state=2;
break;
}
count++; //统计被扫描的个数,用作while继续的条件
}
return 0;
}