我一开始试了一下n=3,发现不行,于是就猜测只有2可以,交了一发,通过了50%。所以我猜测只有偶数可以,奇数都不行。
中间空白部分放n=2的情况就行。因为n=2的情况时,最大只有2,所以我们可以放心地用3,4。我们可以发现,一个图里既然有了n,那么最小一定是-n+1,而不是-n,所以外圈放两个最大的n,n-1,两个最小的,-n+1,-n+2,其他排都是0,这样就可以在空的部分放n=n-2时的情况了,不断递归就行。
比如n=4的完整的图是
再比如6的时候,也是如此。
#include<iostream> using namespace std; int a[201][201]; int N; int k; void dfs(int n) { for(int i=k;i<=N-k+1;i++){ for(int j=k*2-1;j<=N;j++){ a[i][j]=-1; } } for(int j=k*2-1;j<=N;j++){ a[k][j]=1; } for(int i=k;i<N-k+1;i++){ a[i][k*2-1]=1; } a[N-k+1][k*2-1]=0; k++; if(n==2)return; dfs(n-2); } int main() { int t; cin>>t; while(t--){ cin>>N; if(N%2==1)cout<<"impossible"<<endl; else{ cout<<"possible"<<endl; k=1; dfs(N); for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ cout<<a[i][j]<<" "; } cout<<endl; } } } return 0; }
其实应该是想到是规律的了,没有很好的依据n=2的这个条件有利的展开,