幻方问题_幻方讲解

2020-02-29 其他范文 下载本文

幻方问题由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“幻方讲解”。

幻方问题

据说很早以前,夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服。后人称之为“洛书”或“河图”。

如果把图形改成现在通行的阿拉伯数字,就成了下图的样子。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;

运行结果显示:

《幻方问题.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
幻方问题
点击下载文档
相关专题 幻方讲解 幻方 幻方讲解 幻方
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文