题目: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;
}