题解 P2615 【神奇的幻方】

· · 题解

没想到大家都用的公式

其实完全可以找规律模拟结束

附赠一株测试点

当n=5时


17   24   1    8    15

23   5    7    14   16

4    6    13   20   22

10   12   19   21   3

11   18   25   2    9

很容易看出

首先1在第一行n/2+1的位置

接下来每个数依次为前一个数右上的一个

每逢n的倍数就往下走一个

直到n*n停止

莫名其妙的脑回路

详情请看图(忽略图的粗略程度)

此时此刻,找懂了规律,let us 干 it

如果还不懂,上代码君

#include<iostream>
#include<cstdio>
using namespace std;

long s[10001][10001];
int n;
int sum=1,i,j;//i表示层,j表示列,sum计数 

int main()
{
    cin>>n;
    i=1,j=n/2+1;//因为1是从n/2+1列开始,所以以此为j 

    while(sum<=n*n){//到n*n就停 
        s[i][j]=sum;//开始赋值 

        if(sum%n==0){//如果为n的倍数 
            ++i;//就往下走 

            if(i==n+1)// 到头了 
            i=1;
        }
        else
        --i,++j;//其他点往右上方走 

        if(i==0) i=n;
        if(j==n+1) j=1;//如果向右向上到了头 

        ++sum;

    }

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
        cout<<s[i][j]<<" ";
        cout<<endl;
    }//白给的输出

    return 0;
}

此时此刻,完成了使命,ACACAC

2021.1.20

没想到三年前的题解有那么多人喜欢

补充一句:数据点中N都是奇数,可能和题中的

当 N 为奇数时,我们可以通过下方法构建一个幻方:

既然如此,善哉善哉