将1~放在n*n(n为奇数) 的方阵中,使得任意一行任意一列以及两条对角线上的所有元素之和均相等。如n=5时的方阵如下图所示。
15 | 8 | 1 | 24 | 17 |
16 | 14 | 7 | 5 | 23 |
22 | 20 | 13 | 6 | 4 |
3 | 21 | 19 | 12 | 10 |
9 | 2 | 25 | 18 | 11 |
这一问题如果采用试探的方法,在n值较大时,将难以求出,因为可能的状态数是!个。经典的构造方法如下:
将数1 放在第一行的中间元素, 然后往左上的位置上放入下一个数。
若左上的位置已有数,则将其放入该数的下一行中的同一列的位置上。
若已是最左或最上面位置上的元素,则其下一个位置的寻找方法是: 将方阵卷成一个纸筒,然后依此再按同样的方向再找下一个位置,直到n×n个元素全部放入为止。
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
cout<<"几阶幻方?《请输入一个奇数》 "<<endl;
int n;
cin>>n;
int magic[n][n];
//首先是第一行中间的是1
int x = 0;
int y = n/2;
int value = 1;
magic[x][y]=value;
while(value < n*n + 1){
magic[x][y] = value;
if(value%n != 0){
x = (x+n-1)%n;
y = (y+n-1)%n;
}else{
x = (x+1)%n;
}
value++;
}
cout<<"输出纵横图为:"<<endl;
//输出数组
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<magic[i][j]<<"\t";
}
cout<<endl;
}
}
运行结果:
几阶幻方?《请输入一个奇数》
5
输出纵横图为:
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11--------------------------------