人人范文网 范文大全

幻方问题

发布时间:2020-03-04 00:52:48 来源:范文大全 收藏本文 下载本文 手机版

幻方问题

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

如果把图形改成现在通行的阿拉伯数字,就成了下图的样子。

4 9 2

3 5 7

8 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;

运行结果显示:

幻方 勾股定理

“三阶幻方”教学案例—张丽

趣味数学—数阵图与幻方

七年级上册《“幻方”中的游戏》 教学设计苏教版

《幻城》读后感

幻城读后感

《幻城》读后感

幻城经典语录

《幻城》读后感

幻城读后感

幻方问题
《幻方问题.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
相关专题 幻方讲解 幻方
点击下载本文文档