幻方问题_幻方讲解
幻方问题由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“幻方讲解”。
幻方问题
据说很早以前,夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服。后人称之为“洛书”或“河图”。
如果把图形改成现在通行的阿拉伯数字,就成了下图的样子。9 25 7 1 6
我们注意到左面的图形中,九个数字正好是从1到9,既无重复,也没有遗漏,所有横竖线与对角线之和相等。此类图形成为幻方图形,图中给出的为三阶幻方。选择合适算法,使用计算机生成不同阶的幻方。
解法分析:
#include using namespace std;对平面魔方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式)
⑴ N 为奇数时,最简单
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放,按 45°方向行走,如向右上
每一个数存放的行比前一个数的行数减1,列数加1
(3)如果行列范围超出矩阵范围,则回绕。
(4)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
程序:int ABC1(int n)//当n为奇数的时候生成的幻方
{
int i,j,k;int **a=new int*[n];for(i=0;i
for(i=0;i
for(j=0;j
}
} j++;if(i==n-1&&j==n-1){ i++;a[i][j]=k;} if(in-1)j=0;if(a[i][j]==0)a[i][j]=k;else {
} i++;if(i>n-1)i=0;j--;if(j
j=n-1;i++;if(i>n-1)i=0;a[i][j]=k;break;} for(i=0;i
} for(j=0;j
⑵ N为4的倍数时(采用对称元素交换法。)
首先把数1到n×n按从上至下,从左到右顺序填入矩阵
然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对
称交换,即a(i,j)与a(n-1-i,n-1-j)交换,所有其它位置上的数不变。
(或者将对角线不变,其它位置对称交换也可)程序:int ABC2(int n)//当n不是奇数但是能被4整除的数生成的幻方
{
}
⑶ N 为其它偶数时
当n为非4倍数的偶数(即4n+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。按上述奇数阶魔方给分解的4个子方阵对应赋值。上左子阵最小(i),下右子阵次小(i+v),下左子阵最大(i+3v),上右子阵次大(i+2v),即4个子方阵对应元素相差v,其中v=n*n/4 四个子矩阵由小到大排列方式为 ① ③
④ ②然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列做对应交换(jn-t+2), a(t-1,0)与a(t+u-1,0);a(t-1,t-1)与a(t+u-1,t-1)两对元素交换 其中u=n/2,t=(n+2)/4 上述交换使每行每列与两对角线上元素之和相等。int i,j,k;int **a=new int*[n];for(i=0;i
} for(i=0;i
printf(“%4d”,a[i][j]);} cout
a[i][j]=k++;k=n*n+1;for(i=0;i
if((i==j)||(i+j==3))for(W=0;W
for(D=0;D
a[i+W*4][j+D*4]=k-a[i+W*4][j+D*4];return 0;程序:int ABC3(int n)//当n是偶数且不能被4整除的数;
{
int i,j,k;int **a=new int*[n];for(i=0;i
a[i]=new int[n];if(n%2!=1&&n%4!=0){ for(i=0;i
for(j=0;j
i=0;j=n/2-1;k=1;a[i][j]=k++;a[i][j+1]=k++;a[i+1][j]=k++;a[i+1][j+1]=k++;for(k=5;k
i-=2;j+=2;if(i==n-2&&j==n-2){
i+=2;a[i][j]=k++;a[i][j+1]=k++;a[i+1][j]=k++;a[i+1][j+1]=k++;break;a[i][j]=0;} if(in-2)j=0;if(a[i][j]==0){
} else {
i+=2;if(i>n-2)i=0;j-=2;if(j
}
} j=n-2;i+=2;if(i>n-2)i=0;a[i][j]=k++;a[i][j+1]=k++;a[i+1][j]=k++;a[i+1][j+1]=k++;for(i=0;i
{
k=a[i][j];a[i][j]=a[i+1][j];a[i+1][j]=k;} k=a[n/2-1][n/2-1];a[n/2-1][n/2-1]=a[n/2][n/2-1];a[n/2][n/2-1]=k;k=a[n/2-1][n-1];a[n/2-1][n-1]=a[n/2][n-1];a[n/2][n-1]=k;for(j=0;j
{
}
k=a[i][j];a[i][j]=a[i][j+1];a[i][j+1]=k;k=a[n/2][n/2-1];a[n/2][n/2-1]=a[n/2][n/2];a[n/2][n/2]=k;k=a[n-1][n/2-1];a[n-1][n/2-1]=a[n-1][n/2];a[n-1][n/2]=k;k=a[n-2][n-2];a[n-2][n-2]=a[n-2][n-2+1];a[n-2][n-2+1]=k;k=a[n-1][n-2];a[n-1][n-2]=a[n-1][n-2+1];a[n-1][n-2+1]=k;
} for(i=0;i
{
} for(j=0;j
int n;int i;cout>n;int **a=new int*[n];for(i=0;i
ABC1(n);cout>aa;if(aa=='y'||aa=='Y')goto begin;return 0;} else
if(n%4==0)
{
} else { ABC3(n);cout>aa;if(aa=='y'||aa=='Y')
goto begin;}return 0 ABC2(n);cout>aa;if(aa=='y'||aa=='Y')goto begin;
}
运行结果显示: