201412-2
试题名称: Z字形扫描
时间限制: 2.0s
内存限制: 256.0MB
问题描述:
问题描述
在图像编码的算法中,需要将一个给定的方形矩阵进行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的正整数。
/*CCF20141202之Z形扫描*/
//使用了一个goto语言来控制语句的跳转,其实在万不得已的情况下,还是少用goto语句,因为这样打乱语句的正常执行顺序
#include<iostream>
using namespace std;
int main(){
int n;
int input[501][501];//输入数组
int flag=0;//当0时,表示向右移,1时表示左下移,2时表示下移,3时表示右上移
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>input[i][j];
}
}
//四个动作,向右移->左下移->下移->右上移
//用x和y来记录记录当前位置
int x=0,y=0;//定义两个局部变量
cout<<input[0][0]<< ' ';
//向右移
move_to_right:if(x<=n-1 && y<n-1 && flag==0){
//cout<<input[x][y]<< ' ';
y++;//此时y=1
cout<<input[x][y]<< ' ';
goto next;
}
next:if(x==n-1){
if(y==n-1){
goto exit;
}
flag=3;
goto move_to_rightUp;
}
else{
flag=1;
goto move_to_leftDown;
}
//左下移
move_to_leftDown:while(x<n-1 && y<=n-1 && y>0 && flag==1){
y--;
x++;
cout<<input[x][y]<< ' ';
}
if(x==n-1){
flag=0;
goto move_to_right;
}
else{
flag=2;
goto move_to_down;
}
//向下移
move_to_down:if(x<n-1 && y<=n-1 && flag==2){
x++;
cout<<input[x][y]<< ' ';
goto next1;
}
next1:if(y==n-1){
flag=1;
goto move_to_leftDown;
}
else{
flag=3;
goto move_to_rightUp;
}
//右上移 ===bug出现问题
move_to_rightUp:while(x>0 && y<n-1 && flag==3){
x--;
y++;
cout<<input[x][y]<< ' ';
}
if(y==n-1){
flag=2;
goto move_to_down;
}
else{
flag=0;
goto move_to_right;
}
exit://当它在最后一个点时,输出它的值,并且返回,不在执行此程序
return 0;
}