牛客小白月赛2 A 数字方阵 (乱搞,找规律,构造,随机)

题目链接:https://www.nowcoder.com/acm/contest/86/A
分析
一开始以为是各行之和、各列之和、两对角线之和分别不同,想到一种直接1,2,...n*n按顺序从左到右,从上到下直接填的做法,这个时候只有两条对角线之和是相等的,于是把a[1][n]和a[1][1]交换,提交后WA了,发现是各之和都要不同,打表后发现这种构造方法在6-1000之内的偶数都成立,奇数不成立,然后又发现奇数情况下是中间行与中间列之和相等,于是把中间列首位与中间行首位交换,这时候5-1000之内的奇数都成立了,最后特判3,4的情况,就AC了
之后看别人代码,发现这题是用随机做的,长见识了。
代码:

#include <iostream>
#include<map>
using namespace std;
int a[1010][1010];
string three="1 2 3\n8 9 4\n7 6 5\n";
string four="1 2 3 4\n5 6 16 8\n9 10 11 12\n13 14 15 7\n";

int main()
{
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    a[1][1]=n,a[1][n]=1;
    for(int i=2;i<n;i++)a[1][i]=i;
    for(int i=1;i<n;i++){
        for(int j=1;j<=n;j++)
            a[i+1][j]=i*n+j;
    }

    if(n==4){
        cout<<four<<endl;
        return 0;
    }
    if(n==3){
        cout<<three<<endl;
        return 0;
    }
    if(n%2){
        int kk=n/2+1;
        int tem=a[1][kk];
        a[1][kk]=a[kk][1];
        a[kk][1]=tem;
    }
    if(n==4){
        //int kk=n/2+1;
        a[1][n]=n,a[1][1]=1;
        a[2][3]=16,a[n][n]=7;

    }



    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(j!=1)cout<<" ";
            cout<<a[i][j];
        }
        cout<<endl;
    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Surrender/p/8969880.html