1. 程式人生 > >201412-2-Z字形掃描-CCF

201412-2-Z字形掃描-CCF

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