201412-2-Z字形掃描-CCF
阿新 • • 發佈:2018-11-14
題目:http://118.190.20.162/view.page?gpid=T20
解題思路:把方陣分為兩部分,即n*n-(n*n-n)/2和(n*n-n)/2,如下兩種顏色的圖,然後一步一步模擬即可。
o o o
o o o
o o o
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=505; int main(){ int n; int a[N][N]; int vis[N*N]; scanf("%d",&n); memset(a,0,sizeof(a)); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&a[i][j]); } } int i=0,j=0,num=0; vis[num++]=a[i][j]; while(true){ if(num>=n*n-(n*n-n)/2) break; if(num<=n*n-(n*n-n)/2){ if(j+1<n||(i==0&&j==n-1)){ j=j+1; vis[num++]=a[i][j]; } if(num>=n*n-(n*n-n)/2)break; while(i+1<n&&(j-1>=0)){ j=j-1,i=i+1; vis[num++]=a[i][j]; } if(j<0) j++; if(i>=n)i--; if(num>=n*n-(n*n-n)/2)break; if(i+1<n){ i++; vis[num++]=a[i][j]; } if(num>=n*n-(n*n-n)/2)break; while(i-1>=0&&j+1<n){ j=j+1; i=i-1; vis[num++]=a[i][j]; } if(i<0)i++; if(j>n)j--; } } while(true){ if(num>=n*n) break; if(j+1<n){ j=j+1; vis[num++]=a[i][j]; } if(num>=n*n) break; while(i-1>=0&&j+1<n){ i--; j++; vis[num++]=a[i][j]; } if(num>=n*n) break; if(i<0)i++; if(j>n-1) j--; if(i+1<n){ i++; vis[num++]=a[i][j]; } if(num>=n*n) break; while(i+1<n&&j-1>=0){ i++; j--; vis[num++]=a[i][j]; } if(i>n-1)i--; if(j<0)j++; if(num>=n*n) break; } for(int i=0;i<n*n;i++){ printf("%d",vis[i]); if(i!=n*n-1)printf(" "); else printf("\n"); } return 0; }