ccf z字形扫描
试题编号: | 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的正整数。
|
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 const int maxn=1107; 8 int mat[maxn][maxn]; 9 int ans[maxn*maxn]; 10 bool vis[maxn][maxn]; 11 int n; 12 void solve() 13 { 14 memset(vis,0,sizeof(vis)); 15 int i=0,j=0,num=0;bool first=1,flag=0,point=1; 16 while(1){ 17 ans[num++]=mat[i][j]; 18 vis[i][j]=1; 19 if(i==n-1&&j==n-1) break; 20 if(i==n-1&&j==0){ 21 if(vis[n-2][1]){i=n-1;j=1;point=0;first=0;continue;} 22 else{i=n-2;j=1;point=0;first=0;continue;} 23 } 24 else if(j==n-1&&i==0){ 25 if(vis[1][n-2]){i=1;j=n-1;first=0;point=1;continue;} 26 else {i=1;j=n-2;point=1;first=0;continue;} 27 } 28 if(i==0&&first){ 29 first=0; 30 j=j+1; 31 point=1; 32 } 33 else if(j==0&&first){ 34 i=i+1; 35 point=0; 36 first=0; 37 } 38 else if(i==n-1&&first){ 39 j=j+1; 40 point=0; 41 first=0; 42 } 43 else if(j==n-1&&first){ 44 i=i+1; 45 point=1;first=0; 46 } 47 else if(point){ 48 i=i+1;;j=j-1; 49 first=1; 50 } 51 else{ 52 first=1; 53 i=i-1;j=j+1; 54 } 55 } 56 } 57 int main() 58 { 59 // freopen("in.txt","r",stdin); 60 while(~scanf("%d",&n)){ 61 for(int i=0;i<n;i++) 62 for(int j=0;j<n;j++) 63 { 64 scanf("%d",&mat[i][j]); 65 } 66 solve(); 67 bool first=1; 68 for(int i=0;i<n*n;i++) 69 { 70 if(first){ 71 printf("%d",ans[i]); 72 first=0; 73 } 74 else printf(" %d",ans[i]); 75 } 76 printf("\n"); 77 } 78 return 0; 79 }