牛客Another Distinct Values

题目

我一开始试了一下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;
}
View Code

其实应该是想到是规律的了,没有很好的依据n=2的这个条件有利的展开,

posted @ 2018-07-29 23:44  shuai_hui  阅读(182)  评论(0编辑  收藏  举报