题解 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
-
(人生第一篇题解)return 0;
2021.1.20
没想到三年前的题解有那么多人喜欢
补充一句:数据点中N都是奇数,可能和题中的
当 N 为奇数时,我们可以通过下方法构建一个幻方:
既然如此,善哉善哉