平面幻方就是一个n*n的矩阵,矩阵的每一行每一列,加上对角线上元素的和都等于同一个数。
构造幻方的方法。
⑴ 将1放在第一行中间一列;
⑵ 从2开始直到n×n止各数依次按下列规则存放:
按 45°方向行走,如向右下
每一个数存放的行比前一个数的行数减1,列数加1
⑶ 如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最上一行,列数同样加1;
⑷ 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的上面。
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
long a[39][39];
int sum=1,x,y;
x=1,y=n/2+1;
while(sum<=n*n){
a[x][y]=sum;
if(sum%n==0){
++x;
if(x==n+1) x=1;
}
else --x,++y;
if(x==0) x=n;
if(y==n+1) y=1;
++sum;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}