幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。
先来个5*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
n奇数幻方口诀:
1. 数字1放在第一行中间
2. 依次放在上一个数的右上角
2.1如果右边出去了就回到左边(参考3,4)
2.2 如果上面出去了就放下面(1,2)
2.3 如果右上角有了就放在这个数的下面(5,6)
源代码如下:
#include<iostream>
#include <vector>
using namespace std;
void Magic_suqare(int N){
vector<vector<int> > suqare(N,vector<int>(N,0));
if(N&0x1!=1)
return;
int x=0,y=(N>>1);
suqare[x][y]=1;
int count=1,bound=N*N;
while(count<bound){
int nx=(x+N-1)%N;
int ny=(y+1)%N;
if(suqare[nx][ny]!=0){
nx=(x+1)%N;ny=y;
}
suqare[nx][ny]=++count;
x=nx;
y=ny;
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
printf("%3d",suqare[i][j]);
}
cout<<endl;
}
}
int main(){
int n;
cout<<"input the number n:"<<endl;
cin>>n;
Magic_suqare(n);
return 0;
}