文档库 最新最全的文档下载
当前位置:文档库 › 求魔方阵的十种算法

求魔方阵的十种算法

求魔方阵的十种算法
求魔方阵的十种算法

求魔方阵的十种算法

魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。

如3×3的魔方阵:

8 1 6

3 5 7

4 9 2

魔方阵的排列规律如下:

(1)将1放在第一行中间一列;

(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);

(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;

(4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;

(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

1居上行正中央

依次右上切莫忘

上出框时往下写

右出框时左边放

右上有数下边写

右上出框也一样

一、魔方阵的简介

1.何谓矩阵?矩阵就是由方程组的系数及常数所构成的方阵。把用在解线性方程组上既

方便,又直观。

2.何谓n阶方阵?若一个矩阵是由n个横列与n个纵行所构成,共有个小方格,则称这

个方阵是一个n阶方阵。

3.何谓魔方阵?4 9 2 3 5 7 8 1 6定义:由n*n个数字所组成的n阶方阵,具有各对角线,

各横列与纵行的数字和都相等的性质,称为魔方阵。而这个相等的和称为魔术数字。若填入的数字是从1到n*n,称此种魔方阵为n阶正规魔方阵。

4.最早的魔方阵相传古时为了帮助治水专家大禹统治天下,由水中浮出两只庞大动物背

上各负有一图,只有大禹才可指挥其中之由龙马负出的为河图,出自黄河;另一由理龟负出的洛书出自洛河。洛书

5.最早的四阶魔方阵最早的四阶方阵刻在印度一所庙宇石上,年代大约是十一世纪。古代印度人十分崇拜这种幻方,至今从古神殿的遗址,墓碑上常常还可以发现四阶幻方的遗迹。

6.欧洲最早的魔方阵欧洲最早的方阵是公元1514年德国画家Albrecht Dure在他著名的铜板画Melencolia上的4×4幻方,有趣的是,他连创造年代(1514)也镶在这个方阵中,而且上下左右,四个小方阵的和皆为34,是欧洲最古老的幻方。

二、魔方阵的变形

1.相异魔方阵对应方格所填的数字不相同的两个魔方阵,如下图

16 02 03 13 01 15 04 14 05 11 10 08 12 06 09 07 09 07 06 12 13 03 16 02 04 14 15 01 08 10 05 11

2.相等魔方阵每一个对应方格所填的数字都相同的两个魔方阵,如下图4 9 2 4 9 2 3 5 7

3 5 7 8 1 6 8 1 6

3.全等魔方阵若一个魔方阵能够经过旋转或镜射的方式变成和另一个魔方阵相等,称这两个魔方阵全等。在计算魔方阵个数时,我们把全等的魔方阵视为同一种。2 7 6 8 3 4 9 5 1 1 5 9 4 3 8 6 7 2

4,刚性变形法(1)顺时针方向旋转90 (2)顺时针方向旋转180 (3)顺时针方向旋转270 (4)左右翻转(绕铅直对称轴镜射) (5)上下翻转(绕水平对称轴镜射) (6)左上右下翻转(绕右上至左下对角线镜射) (7)右上左下翻转(绕左上至右下对角线镜射)

原始方阵旋转90。旋转180。旋转270。01 03 16 14 12 08 13 01 07 05 10 12 14 04 09 07 13 15 02 04 10 06 15 03 09 11 06 08 16 02 11 05 08 06 11 09 05 11 02 16 04 02 15 13 03 15 06 10 12 10 05 07 07 09 04 14 14 16 03 01 01 13 08 12

左右翻转上下翻转左上右下翻转右上左下翻转14 16 03 01 12 10 05 07 07 09 04 14 01 13 08 12 04 02 15 13 08 06 11 09 05 11 02 16 03 15 06 10 09 11 06 08 13 15 02 04 10 06 15 03 16 02 11 05 07 05 10 12 01 03 16 14 12 08 13 01 14 04 09 07 5.加值变形法正规魔方阵:首项是1,公差是1加值变形后的魔方阵:首项是a,公差是r

原始魔方首项为5公差为1首项为5公差为2 14 16 03 01 18 20 07 05 31 35 09 05 04 02 15 13 08 06 19 17 11 07 33 29 09 11 06 08 13 15 10 12 21 25 15 19 07 05 10 12 11 09 14 16 17 13 23 27

6.互补变形法就是将魔方阵中的每一个数字都替换成互补数的变形方式。在n阶魔方阵中,数字k的互补数=(1+n*n)–k

原始魔方阵互补变形魔方阵14 16 03 01 03 01 14 16 04 02 15 13 13 15 02 04 09 11 06 08 08 06 11 09 07 05 10 12 10 12 07 05

7.田字变形法以中心点为准将魔方阵分成四个相等的小方阵。当n为奇数时,中央的行列要独立出来。

n是偶数时n是奇数时ABA A1 BDC? D1 E B1 D C1 C将魔方阵如下重组: CD ? C C1 D? BA B1 E D1 B A1 A

可参考下面的范例:原始4阶魔方阵4阶田字变形魔方阵原始5阶魔方阵5阶田字变形魔方阵01 03 16 14 11 09 08 06 18 22 01 10 14 13 17 09 21 05 13 15 02 04 05 07 12 10 04 08 12 16 25 24 03 20 07 11 08 06 11 09 16 14 01 03 15 19 23 02 06 02 06 23 15 19 12 10 05 07 02 04 13 15 21 05 09 13 17 10 14 01 18 22 07 11 20 24 03 16 25 12 04 08 8.井字对换变形法(1)任选一数k,1<=k<=n 。(2)将方阵的第k行和其互补行(第n+1-k行)对换。(3)将方阵的第k列和其互补列(第n+1-k列)对换。(4)为方便称呼,此时姑且命名为k值井字对换变形。

原始魔方阵1值井字对换魔方阵2值井字对换魔方阵1,2值井字对换魔方阵01 03 16 14 07 10 05 12 01 16 03 14 07 05 10 12 13 15 02 04 04 15 02 13 08 11 06 09 09 11 06 08 08 06 11 09 09 06 11 08 13 02 15 04 04 02 15 13 12 10 05 07 14 03 16 01 12 05 10 07 14 16 03 01 9.拓朴变形法( 1)任选不相等的两数1<=k1,k2<=n,但当(n+1)/2为奇数时,k1及k2不能等于(n+1)/2。(2)将座标含k1值的全改成k2。含k2值的全改成k1。含n+1-k1值的全改成n+1-k2。含n+1-k2值的全改成n+1-k1。(3)为方便称呼,此时姑且命名为k1,k2拓朴变形。

可参考下面的3阶1,3拓朴变形示意图(1,1) (1,2) (1,3) (3,3) (3,2) (3,1) (2,1) (2 ,2) (2,3) (2,3) (2,2) (2,1) (3,1) (3,2) (3,3) (1,3) (1,2) (1 ,1)

可参考下面的范例原始魔方阵1,2拓朴变形魔方阵18 22 01 10 14 08 04 12 25 16 04 08 12 16 25 22 18 01 14 10 15 19 23 02 06 19 15 23 06 02 21 05 09 13 17 11 07 20 03 24 07 11 20 24 03 05 21 09 17 13注:其实对换变形、田字变形可包含于拓朴变形中,只因想法不同故列出参考

三、奇数阶魔方阵的建构法

1.杨辉法发明者:杨辉适用:三阶魔方阵方法:九子斜排,上下对易,左右相更,四维挺进

***1*** **4*2** 4 9 2 *7*5*3* 3 5 7 **8*6** 8 1 6 ***9***

杨辉法推广-菱形法发明者:Bachet de Meziriac适用:奇数阶魔方阵方法:数字斜排,上下对易,左右相更,四维挺进

********01******** ******06**02****** ? ? ? ****11**07**03*** * 11 24 07 20 03 **16**12**08**04** 04 12 25 08 16 21**17**13**09**05 17 05 13 21 09 **22**18* *14**10** 10 18 01 14 22 ****23**19**15**** ? 23 06 19 02 15 ******24**20****** * *******25********

2.简捷连续填制法发明者:De La Loubere适用:奇数阶魔方阵方法:1立首列中,右一上一,受阻下一

* * 1 * * * * 1 * * * * 1 * * * * 1 * * * * 1 8 * 17 24 1 8 15 * * * * * * * * * * * 5 * * * * 5 * * * * 5 7 * * 23 5 7 14 16 * * * * * * * * * * 4 * * * * 4 6 * * * 4 6 * * * 4 6 13 20 22 * * * * * * * * * * * * * * 3 * * * * 3 10 * * * 3 10 12 19 21 3 * * * * * * * * 2 * * * * 2 * * * * 2 * 11 * * 2 9 11 18 25 2 9简捷连续填制法推广适用:奇数阶魔方阵方法:(1)1立首列中,右1上1,受阻下1;(2)1立中央上,右1下2,受阻上2;(3 )1立首行中,右2下1,受阻右1;(4)1立首列中,右1下2,受阻下4;(5)1立中央上,右1上1,受阻上2 ;

(6)1立首行中,左1上1,受阻右1。

3.辅助方阵法适用:五阶以上奇数阶魔方阵方法:(1)制作辅助方阵一:在左上端填入1,按照走马的方式往右二下一的方向填入1至底,接着在每列的1的右边依序填入2、3、4…n 1 * * * * 1 2 3 4 5 1 2 3 4 5 * * 1 * * * * 1 * * 4 5 1 2 3 * * * * 1 * * * * 1 2 3 4 5 1 * 1 * * * * 1 * * * 5 1 2 3 4 * * * 1 * * * * 1 * 3 4 5 1 2 (2)制作辅助方阵二:在左上端填入0,按照走马的方式往右一下二的方向填入0至底,接着在每列的0的下面依序填入n、2n、3n…n(n-1) 0 * * * * 0 15 5 20 10 1 17 8 24 15 * * * 0 * 5 20 10 0 15 9 25 11 2 18 * 0 * * * 10 0 15 5 20 12 3 19 10 21 * * * * 0 15 5 20 10 0 20 6 22 13 4 * * 0 * * 20 10 0 15 5 23 14 5 16 7 (3)将辅助方阵一与二的对应方格内之数相加填到一个新的方阵对应方格内,则新的方阵即为一个魔方阵。

4.扩阶法适用:n阶魔方阵,n为大于5的正整数方法:(1)先建构出一个n-2阶的魔方阵(2)将(1)所建立的魔方阵每个数字再加上2n-2 (3)将步骤(2)的魔方阵外面再加上一圈,这一圈有4n-4个空格,填入的数为1~(2n-2)和( -2n+3)~n*n,先算出魔术数字会比较好填。

8 1 6 16 09 14 23 01 02 20 19 3 5 7 11 13 15 22 16 09 14 04 4 9 2 12 17 10 05 11 13 15 21 08 12 17 10 18 07 25 24 06 03 5.方阵合成法适用:当魔方阵的阶数n可分解成两个大于2之整数p、q的乘积方法:假设A=[(a)ij]与B=[(b)ij]分别代表m阶与n阶魔方阵,对每个t=1,2…m*m,令At=[(a)ij+m*m(t–1)]。接着我们将方阵B中的数t以m阶魔方阵(A)t 代替,就可以得到一个m.n阶魔方阵。

可参考下面的范例魔方阵A魔方阵B 35 28 33 26 19 24 71 64 69 8 1 6 4 3 8 30 32 34 21 23 25 66 68 70 3 5 7 9 5 1 31 36 29 22 27 20 67 72 65 4 9 2 2 7 6 80 73 78 44 37 42 08 01 06 75 77 79 39 41 43 03 05 07 A4 A3 A8 76 81 74 40 45 38 04 09 02 A9 A5 A1 17 10 15 62 55 60 53 46 51 A2 A7 A6 12 14 16 57 59 61 48 50 52 13 18 11 58 63 56 49 54 47

四、偶数阶魔方阵的建构法

1、杨辉法发明者:杨辉适用:4阶魔方阵方法:以十六子,依次递作四行排列,先以

外四子对换,一换十六、四换十三,以四内角对换,六换十一、七换十,横直上下斜角,皆三十四数,对换止可施之于小。

01 02 03 04 16 02 03 13 16 02 03 13 05 06 07 08 05 06 07 08 05 11 10 08 09 10 11 12 09 10

11 12 09 07 06 12 13 14 15 16 04 14 15 01 04 14 15 01

杨辉法推广-消去对角线法适用:四之倍数阶魔方阵方法:(1)先将整个方阵划分成k*k 个4阶方阵,然后在每个4阶方阵的对角线上做记号( 2)由左而右、由上而下,遇到没有记号的位置才填数字,但不管是否填入数字,每移动一格数字都要加1 (3)自右下角开始,由右而左、由下而上,遇到没有数字的位置就填入数字,但每移动一格数字都要加1

2.井字法适用:四之倍数阶魔方阵方法:(1)把1~n*n从左上角依序填入方阵内(2)用两

条铅直线和两条水平线将方阵分隔成四个角落各有一个n/4阶的子方阵,和中心位置有一个n/2阶的子方阵(3)以方阵中心为对称点,将五个子方阵的数字作对称交换,其它的数字不要动。这样的方阵会是一个魔方阵

01 02 03 04 16 02 03 13 05 06 07 08 05 06 07 08 09 10 11 12 09 10 11 12 13 14 15 16 04 14

15 01

3.辅助方阵法适用:偶数阶魔方阵(因非四的倍数作法相当复杂,在此只介绍四的倍数

的作法)方法:(1)制作辅助方阵一:第一列由左向右排列1至n,第二列由右向左排列1至n,第三列同第二列,第四列同第一列,若超过四列,重复一至四列的作法,完成辅助方阵一(2)制作辅助方阵二:将第一个辅助方阵各方格内的数字x换成n(x-1),再做行列互换,完成辅助方阵二(3)将辅助方阵一与二的对应方格内之数相加填到一个新的方阵对应方格内,则新的方阵即为一个魔方阵01 02 03 04 00 12 12 00 01 14 15 04 04 03

02 01 04 08 08 04 08 11 10 05 04 03 02 01 08 04 04 08 12 07 06 09 01 02 03 04 12 00 00 12

13 02 03 16

4.扩阶法同奇数阶之作法

5.方阵合成法同奇数阶之作法

二、具体做法:

方法一;

/*此程序使我按照上面介绍的魔方阵的规律编写的,不过只能求奇数魔方阵,经过测试可以算到508阶*/

#define N 7

#include

void main()

int a[N][N],i,j,k;

for(i=0;i

for(j=0;j

{

a[i][j]=0; /*先令所有元素都为0*/

}

j=(N-1)/2; /*判断j的位置*/

a[0][j]=1; /*将1放在第一行中间一列*/

for(k=2;k<=N*N;k++) /*再从2开始处理*/

{

i=i-1; /*存放的行比前一个数的行数减1*/

j=j+1; /*存放的列比前一个数的列数加1*/

if((i<0)&&(j==N)) /*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/

{

i=i+2;

j=j-1;

}

else

{

if(i<0) /*当行数减到第一行,返回到最后一行*/

i=N-1;

if(j>N-1) /*当列数加到最后一行,返回到第一行*/

j=0;

}

if(a[i][j]==0) /*如果该元素为0,继续执行程序*/

a[i][j]=k;

else /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/

{

i=i+2;

j=j-1;

a[i][j]=k;

}

}

for(i=0;i

{

for(j=0;j

printf("%5d",a[i][j]);

printf("\n\n");

}

}

三、方法二:

/*这个是网友qfyzy为帮助我找错而提供的,可以算到99阶*/

#define N 7

#include

void main()

{

int a[N][N]={0},i=0,j,k; /*先令所有元素都为0*/

j=(N-1)/2;

i=0;

for(k=1;k<=N*N;) /*开始处理*/

{

if((i<0)&&(j==N)) /*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/

{

i=i+2;

j=j-1;

}

else if(i<0) /*当行数减到第一行,返回到最后一行*/

i=N-1;

else if(j>N-1) /*当列数加到最后一行,返回到第一行*/

j=0;

else if(!a[i][j]){ /*如果该元素为0,继续执行程序*/

a[i][j]=k++;

i=i-1;

j=j+1;

}

else /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/

{

i=i+2;

j=j-1;

}

}

for(i=0;i

{

for(j=0;j

printf("%5d",a[i][j]);

printf("\n\n");

}

}

四、方法三:

/*此程序是在网上找到的c程序设计习题7.7的答案,只能算奇数阵,可以算到15阶*/ #include

void main()

{int a[16][16],i,j,k,p,m,n;

p=1;

while(p==1)

{printf("请输入阶数:"); /*原答案没有这个输出语句*/

scanf("%d",&n);

if((n!=0)&&(n<=15)&&(n%2!=0))p=0;

}

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

a[i][j]=0;

j=n/2+1;

a[1][j]=1;

for(k=2;k<=n*n;k++)

{i=i-1;

j=j+1;

if((i<1)&&(j>n))

{i=i+2;

j=j-1;

}

else

{if(i<1)i=n;

if(j>n)j=1;

}

if(a[i][j]==0)a[i][j]=k;

else

{i=i+2;

j=j-1;

a[i][j]=k;

}

}

for(i=1;i<=n;i++)

{for(j=1;j<=n;j++)

printf("%3d",a[i][j]);

printf("\n");

}

}

五、/*下面的都是在网上搜索到的,大多数是在编程论坛找到的*/

方法四:

/*这个是我找到的功能最强大的求魔方阵的程序,奇、偶阵都可以求,可以多次测试,最大阶可以自己设定(我测试的最大设定值是507,此时可以运行到506阶,不过也可以设定到508,但是这时真正运行的时候却达不到506阶)*/

#include

#include

#include

#include

#define MAX_INDEX 100 /*这里可以修改最大阶*/

void swap(int *a,int *b)

{

int t;

t=*a;

*a=*b;

*b=t;

}

/*快速排序算法*/

void QuickSort(int a[], int l, int r)

{

int i=l; /*从左至右的游标*/

int j=r + 1; /*从右到左的游标*/

int pivot=a[l];

if (l >= r) return;

/*把左侧>= pivot的元素与右侧<= pivot 的元素进行交换*/ while (1)

{

do

{/*在左侧寻找>= pivot 的元素*/

i = i + 1;

} while (a[i] < pivot);

do

{/*在右侧寻找<= pivot 的元素*/

j = j - 1;

} while (a[j] > pivot);

if (i >= j) break; /*未发现交换对象*/

swap(&a[i],&a[j]);

}

/*设置p i v o t*/

a[l] = a[j];

a[j] = pivot;

QuickSort(a, l, j-1); /*对左段排序*/

QuickSort(a, j+1, r); /*对右段排序*/

}

void Huanf(int Array[][MAX_INDEX],int n)

{

int i,j;

int a,b,m;

int tempArray1[MAX_INDEX];

int tempArray2[MAX_INDEX];

a=n/2;

b=a+1;

m=n%4;

switch(m)

{

case 0:

case 2:

/*穿心对调*/

for(i=0;i

for(j=0;j

{

if(i

{

if(i%2==1&&Array[i][j]%2==0)/*偶行换偶*/ {

swap(&Array[i][j],&Array[n-1-i][n-1-j]);

}

else if(i%2==0&&Array[i][j]%2==1)/*奇行换奇*/ {

swap(&Array[i][j],&Array[n-1-i][n-1-j]);

}

}

else

{

if(i%2==1&&Array[i][j]%2==1)/*偶行换奇*/ {

swap(&Array[i][j],&Array[n-1-i][n-1-j]);

}

else if(i%2==0&&Array[i][j]%2==0)/*奇行换偶*/ {

swap(&Array[i][j],&Array[n-1-i][n-1-j]);

}

}

}

/*End穿心对调*/

if(m==2)

{

for(i=0;i

{

if((i!=0)&&(i!=a-1)&&(i!=b-1)&&(i!=n-1))

{

swap(&Array[i][a-1],&Array[n-1-i][a-1]);

swap(&Array[b-1][i],&Array[b-1][n-1-i]);

}

}

swap(&Array[0][a-1],&Array[0][b-1]);

swap(&Array[a-1][0],&Array[b-1][0]);

swap(&Array[2][0],&Array[2][n-1]);

swap(&Array[0][2],&Array[n-1][2]);

}

break;

case 1:

case 3:

/*穿心对调*/

for(i=0;i

for(j=0;j

{

if(i

{

if(i%2==1&&Array[i][j]%2==0) /*偶行换偶*/ {

swap(&Array[i][j],&Array[n-1-i][n-1-j]);

}

else if(i%2==0&&Array[i][j]%2==0)/*奇行换奇*/ {

swap(&Array[i][j],&Array[n-1-i][n-1-j]);

}

}

else if(i>n/2)

{

if(i%2==1&&Array[i][j]%2==0)/*偶行换偶*/ {

swap(&Array[i][j],&Array[n-1-i][n-1-j]);

}

else if(i%2==0&&Array[i][j]%2==0)/*奇行换奇*/ {

swap(&Array[i][j],&Array[n-1-i][n-1-j]);

}

}

}

/*End穿心对调*/

/*重排米字*/

for(i=0;i

{

tempArray1[i]=Array[i][i];

tempArray2[i]=Array[a][i];

}

QuickSort(tempArray1,0,n-1);

QuickSort(tempArray2,0,n-1);

for(i=0;i

{

Array[i][i]=tempArray2[i];

Array[a][i]=tempArray1[i];

}

for(i=0;i

{

tempArray1[i]=Array[i][n-1-i]; tempArray2[i]=Array[i][a];

}

QuickSort(tempArray1,0,n-1);

QuickSort(tempArray2,0,n-1);

for(i=0;i

{

Array[i][n-1-i]=tempArray2[i];

Array[i][a]=tempArray1[i];

}

/*End重排米字*/

if(m==3)

{

for(i=0;i

{

if((i!=a-1)&&(i!=b-1)&&(i!=a+1))

{

swap(&Array[i][a-1],&Array[n-1-i][a-1]); swap(&Array[a-1][i],&Array[a-1][n-1-i]); }

}

swap(&Array[a-1][a-1],&Array[a+1][a+1]); swap(&Array[a-1][b-1],&Array[a+1][b-1]); }

break;

default:

break;

return;

}

void main()

{

int Ne[MAX_INDEX][MAX_INDEX];

int i,j,n;

while(1)

{

printf("Please Input N (0 quit): \n");

scanf("%d",&n);

if(n==0)

break;

/*数组赋初值*/

for(i=0;i

for(j=0;j

Ne[i][j]=i*n+(j+1);

Huanf(Ne,n);

for(i=0;i

for(j=0;j

{

printf("%-4d",Ne[i][j]);

if(j==n-1)

printf("\n");

}

printf("\n");

getch();

}

}

六、方法五:

/*相比方法四的程序,这个程序更加简洁,唯一的缺陷是只能求奇数魔方阵,也可以多次测试,最大阶可以自己设定(我测试的最大设定值是507,此时也可以运行到507阶)*/

#include

#include

#define MAXSIZE 21 /*这里可以修改最大阶*/

void main(void)

int matrix[MAXSIZE][MAXSIZE]; /* the magic square */

int count; /* 1..n*n counting */

int row; /* row index */

int column; /* column index */

int order; /* input order */

char line[100];

do{

system("cls");

printf("\n\t\t\t 奇数阶魔方阵(输入1退出程序)");

printf("\n\t\t\t======================================"); printf("\n\n请输入一个小于等于%d的奇数:",MAXSIZE);

gets(line);

order=atoi(line);

if(order==1)

exit(0);

if (order>MAXSIZE)

printf("\n\t\t*** Error *** 输入的奇数<%d\n", MAXSIZE);

else if (order%2==0)

printf("\n\t\t*** Error *** 输入的必须是奇数!!!\n");

else

{

row=0; /* start of from the middle */

column=order/2; /* of the first row. */

for (count=1;count<=order*order; count++)

{

matrix[row][column] = count; /* put next # */

if (count % order == 0) /* move down ? */

row++; /* YES, move down one row */

else

{ /* compute next indices */

row = (row == 0) ? order - 1 : row - 1;

column = (column == order-1) ? 0 : column + 1;

}

}

printf("\n\n%d阶魔方阵如下:\n\n", order);

for (row=0; row < order; row++)

{

for (column = 0; column < order; column++)

printf("%4d", matrix[row][column]);

printf("\n");

}

}

system("pause");

}while(order!=1);

}

七、方法六:

/*这个程序的功能也很强大,奇、偶阵都可以求,最大阶可以自己设定(我测试的最大设定值是508,此时可以运行到508阶)*/

#include

#include

#define MAX_NUM 15 /*这里可以修改最大阶*/

int main()

{

int rows = 0, center = 0, iArray[MAX_NUM][MAX_NUM];

int RowSet = 0, LineSet = 0, newRowSet = 0, newLineSet = 0;

int i = 0, j = 0;

int okNum = 0;

// set the items of array "iArray" to be 0

for ( i = 0; i < MAX_NUM; i++ )

for ( j = 0; j < MAX_NUM; j++ )

iArray[i][j] = 0;

// get the rows number

while ( 1 )

{

printf("输入行数:\n");

scanf("%d", &rows);

if ( rows <= MAX_NUM )

{

rows -= 1;

break;

}

else {

printf("行数必须在0 和%d 之间, 请重新", MAX_NUM);

}

}

// set number '1'

center = rows / 2;

iArray[0][center] = 1;

// initialize the okNum, RowSet and LineSet

okNum = 1;

RowSet = 0;

LineSet = center;

// set each item in "iArray"

while ( okNum < (rows + 1) * (rows + 1) )

{

if ( RowSet == 0 && LineSet == rows )

{

RowSet += 1;

}

else {

newRowSet = (RowSet == 0) ? rows : RowSet - 1;

newLineSet = (LineSet == rows) ? 0 : LineSet + 1;

if ( iArray[newRowSet][newLineSet] != 0 )

// there is already a number here!

{

RowSet = (RowSet == rows) ? 0 : RowSet + 1;

//RowSet += 1;

}

else{

RowSet = newRowSet;

LineSet = newLineSet;

}

}

iArray[RowSet][LineSet] = ++okNum;

}

// print the "iArray"

for ( i = 0; i <= rows; i++ )

{

for ( j = 0; j <= rows; j++ )

printf("%5d", iArray[i][j]);

printf("\n");

}

system("pause");

return 0;

}

八、方法七:

/*此程序可以运行到508阶魔方阵*/

#define N (int)5 /*这里可以修改最大阶*/

#include

void main()

int i,k,c;

int m[N][N]={0};

i=0; k=N/2;

for(c=1;c<=N*N;c++)

{

if(m[i][k]!=0)

{

i++;

if(i>N-1)i=0;

i++;

if(i>N-1)i=0;

k--;

if(k<0)k=N-1;

}

m[i][k]=c;

i--;k++;

if(i<0)i=N-1;

if(k>N-1)k=0;

}

printf(" %d 阶魔方阵:\n\n",N);

for(i=0;i

{

for(k=0;k

printf("%4d",m[i][k]);

printf("\n");

}

}

九、方法八:

/*此程序可以运行3阶到15阶奇数阵*/

#include

#define N 15

int main(void)

int i,j,row,cloum,size,square[N][N],count;

printf("please enter the square size(odd && <=15):\n");

scanf("%d",&size);

while(size%2==0||size>15||size<3)

{

printf("error due to the wrng input!please input it again!\n");

scanf("%d",&size);

}

for(i=0;i

for(j=0;j

square[i][j]=0;

i=0;

j=(size-1)/2;

square[i][j]=1;

for(count=2;count<=size*size;count++)

{

row=i-1<0?(size-1):(i-1);

cloum=j-1<0?(size-1):(j-1);

if(square[row][cloum])

i=(++i)%size;

else

{

i=row;

j=j-1<0?(size-1):(j-1);

}

square[i][j]=count;

}

printf("the %d square is:\n",size);

for(i=0;i

{

for(j=0;j

printf("%5d",square[i][j]);

printf("\n");

}

getchar();

getchar();

return 0;

}

十、方法九:

/*此程序由行矩阵、列矩阵和自然矩阵计算魔方阵的,可以运行到359阶魔方阵*/ #include "stdio.h"

#define N 7 /*这里可以修改最大阶*/

main()

{

int col[N][N],row[N][N];

int i,j;

/*求行矩阵*/

for(i=0;i

{

for(j=0;j

{

col[i][j]=(-1)*i+j+(N+1)/2;

if(col[i][j]>N)

col[i][j]-=N;

if(col[i][j]<1)

col[i][j]+=N;

}

}

/*求列矩阵*/

for(i=0;i

{

for(j=0;j

{

row[i][j]=col[i][N-j-1];

}

}

/*由行矩阵、列矩阵和自然矩阵计算魔方阵*/ for(i=0;i

{

for(j=0;j

{

printf("%5d",(col[i][j]-1)*N+row[i][j]);

}

printf("\n");

}

}

十一、方法十:

/*此程序可以求3到19阶的魔方阵*/

#include

main()

{

int i,j,n,k,p,q,t,sum,a[20][20]={0};

printf("Please input N:\n");

scanf("%d",&n);

sum=n*(n*n+1)/2;

t=n;

if(n<3||n>20)

printf("The number is out of range.");

else if(n%2!=0) /* According to the De La Loubere's Method for odd level Rubik Cube */ {

k=1;

i=0;

j=(n-1)/2;

while(k<=n*n)

{

while(a[i][j]==0)

{

a[i][j]=k;

k++;

if(i==0)

i=n-1;

else i=i-1;

if(j==n-1)

j=0;

else j=j+1;

}

if(i==n-1)

i=1;

else i=i+2;

if(j==0)

j=n-1;

else j=j-1;

}

}

else {

if(n%4!=0) /* According to the Y anghui's Extended Method for quadruple level Rubik Cube */

n-=2;

p=2;

q=n*n+1;

for(i=1;i<=n;)

{

while(i%4==0||i%4==1)

{

if(i%4==0)

{

p+=2;

q+=1;

魔方阵算法及C语言实现

魔方阵算法及C语言实现 1 魔方阵概念 魔方阵是指由1,2,3……n2填充的,每一行、每一列、对角线之和均相等的方阵,阶数n = 3,4,5…。魔方阵也称为幻方阵。 例如三阶魔方阵为: 魔方阵有什么的规律呢? 魔方阵分为奇幻方和偶幻方。而偶幻方又分为是4的倍数(如4,8,12……)和不是4的倍数(如6,10,14……)两种。下面分别进行介绍。 2 奇魔方的算法 2.1 奇魔方的规律与算法 奇魔方(阶数n = 2 * m + 1,m =1,2,3……)规律如下: 1.数字1位于方阵中的第一行中间一列; 2.数字a(1 < a ≤ n2)所在行数比a-1行数少1,若a-1的行数为1,则a的行数为 n; 3.数字a(1 < a ≤ n2)所在列数比a-1列数大1,若a-1的列数为n,则a的列数为 1; 4.如果a-1是n的倍数,则a(1 < a ≤ n2)的行数比a-1行数大1,列数与a-1相同。 2.2 奇魔方算法的C语言实现 1 #include 2// Author: https://www.wendangku.net/doc/22810038.html,/ 3// N为魔方阶数 4#define N 115 6int main()7{8int a[N][N]; 9int i;10 int col,row;111 2 col = (N-1)/2;1 3 row = 0;1415 a[row][col] = 1;1617for(i = 2; i <= N*N; i++)18 {19 if((i-1)%N == 0 )20 {21 row++;22 }23

else24 {25// if row = 0, then row = N-1, or row = row - 126 row--;27 row = (row+N)%N;2829 // if col = N, then col = 0, or col = col + 130 col ++;31 col %= N;32 }33 a[row][col] = i;34 }35for(row = 0;row 2// Author: https://www.wendangku.net/doc/22810038.html,/ 3// N为魔方阶数, 4#define N 1 2 5 6int main() 7{ 8int a[N][N];//存储魔方 9 int i, temp;//临时变量10int col, row;//col 列,row 行1112//初始化1 3 i = 1;14for(row = 0;row < N; row++)15 {16 for(col = 0;col < N; col ++)17 {18 a[row][col] =i;19 i++;20 }21 }2223//翻转中间列24for(row = 0; row < N/2; row ++)25 {26for(col = N/4;col < N/4*3;col ++)27 {28 temp = a[row][col];29 a[row][col] = a[N-row-1][col];30 a[N-row-1][col] = temp;31 }32 }3334//翻转中间行35for(col = 0; col < N/2; col ++)36 {37for(row = N/4;row < N/4* 3;row ++)38 {39 temp = a[row][col];40 a[row][col] = a[row][N-col-1];41 a[row][N-col-1] = temp;42 }43 }4445for(row = 0;row < N; row++)46

魔方阵

问题3.1、n –魔方阵 一、提出问题 所谓“n – 魔方阵”是指由1至n 这n 个不同整数构成的魔方阵,其魔方常数为n ( n + 1 ) / 2。例如,5 – 魔方阵和7 – 魔方阵如图3 – 1所示。易知,这两个魔方阵的魔方常数分别为15和28。 321541543 24321 52154 35432 1 ,4 3217651 76543254321762176543654321732176547654321 图3 – 1 5 – 魔方阵和7 – 魔方阵 n – 魔方阵的数字排列很有规律,若用人工的方法给出并不困难。现在要求给出:能让计算机自动输出n (≥ 3)为奇数时形如图3 – 1所示的n – 魔方阵的算法。 二、简单分析 n – 魔方阵较我们之后将要讨论的奇、偶数阶魔方阵,要简单许多。观察后不难发现: 1.要填入的n 个数字在阵列的每一行和每一列都要出现且仅出现一次,且各行(列)中的数字顺序相同,这里的顺序是指循环顺序,其中数字1接在数字n 的后面。 2.从阵列的行来看,每一行的第一个数字与它上一行正中间的数字相同。 通过对“n – 魔方阵”的分析,下面几个基本问题必须得到解决: ◆ 如何确定阵列第一行各个数字? ◆ 在填入其他行的数字时如何保证数字原有的顺序不改变同时每一行的第一个数字正好是其上一行正中间的数字? 三、设计准备 假设我们要构建的是一个n – 魔方阵,为此定义一个有n 行n 列的二维数组。 1.确定阵列第一行各个数字 这里我们处理的方法很简单,即可以利用循环方法顺序地在二维数组第一行中填写1,2,3,…,n 这n 个自然数即可。 2.填入其他行的数字,并保证数字原有的顺序不改变同时每一行的第一个数字正好是其上一行

简单易学的两种还原魔方的口诀及公式图解详解

图解简单易学的两种还原魔方的常用口诀公式 前言 我们常见的魔方是3x3x3的三阶魔方,英文名Rubik's cube。是一个正6 面体,有6种颜色,由26块组成,有8个角块;12个棱块;6个中心块(和中心轴支架相连)见下图: (图1) 学习魔方首先就要搞清它的以上结构,知道角块只能和角块换位,棱块只能和棱块换位,中心块不能移动。 魔方的标准色: 国际魔方标准色为:上黄-下白,前蓝-后绿,左橙-右红。 (见图2)注:(这里以白色为底面,因为以后的教程都将以白色为底面, 为了方便教学,请都统一以白色为准)。 (图 2)

认识公式 (图3)(图4)公式说明:实际上就是以上下左右前后的英文的单词的头一个大写字母表示 (图5)

(图6) (图7)

(图8) 三阶魔方入门玩法教程(一) 步骤一、完成一层 首先要做的是区分一层和一面:很多初学者对于“一面”与“一层”缺乏清楚的认识,所以在这里特别解释一下。所谓一层,就是在完成一面(如图2的白色面)的基础上,白色面的四条边,每条边的侧面只有一种颜色,图(2). 如图(1)中心块是蓝色,则它所在面的角和棱全都是蓝色,是图(2)的反方向 图(3)和(4)则是仅仅是一面的状态,而不是一层! (1)(2) (3)(4) 注:图(2)和(4)分别是图(1)和(3)的底面状态 想完成魔方,基础是最重要的,就像建筑一样,魔方也如此,基础是最重要的。

由于上文提到过中心块的固定性,这一性质,在魔方上实质起着定位的作用,简单的说就是中心块的颜色就代表它所在的面的颜色。 一、十字(就是快速法中的CROSS ) 第一种情况如图所示: 公式为R2 第二种情况如图所示: (白色下面颜色为橙色,为方便观察,特意翻出颜色) 橙白块要移到上右的位置,现在橙白块在目标位置的下面。但其橙色片没有和橙色的中心块贴在 一起。为此我们先做D’ F’ 即把橙色粘在一起,接着 R 还原到顶层,, F 是把蓝白橙还原到正确的位置(上面的F’ 使蓝白块向左移了九十度)。 公式为D’ F’ R F 图解: 当然,架十字不只只有上面两种情况,现我们在分析下其它的一些情况吧! 如下图: 橙白块的位置己对好,但颜色反了,我就先做R2化成第二种情况,然后用还原第二种情况的 (橙色下面颜色为白色,为方便观察,特意翻出颜色)

数据结构 第5章 魔方阵

数据结构 实验报告第五章 实验名称:魔方阵 实验类型:设计性实验 班级: 学号: 姓名: 实验日期:2014年6月7日 1.问题描述 魔方阵是一个古老的智力问题,它要求在一个m×m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所示。 基本要求 ●输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判 断,如m有错,能给出适当的提示信息。 ●实现魔方阵。 ●输出魔方阵。 2.数据结构设计 这个问题的数据结构使用数组就可以解决。 3.算法设计 ●由1开始填数,将1放在第0行的中间位置。 ●将魔方阵想象成上下、左右相接,每次往左上角走一步,会有下列情况: ?左上角超出上方边界,则在最下边相对应的位置填入下一个数字; ?左上角超出左边边界,则在最右边相应的位置填入下一个数字; ?如果按上述方法找到的位置已填入数据,则在同一列下一行填入下 一个数字。 以3×3魔方阵为例,说明其填数过程,如图2所示。

图2 三阶魔方阵的生成过程 由三阶魔方阵的生成过程可知,某一位置(x,y)的左上角的位置是(x-1,y-1),如果x-1≥0,不用调整,否则将其调整为x-1+m;同理,如果y-1≥0,不用调整,否则将其调整为y-1+m。所以,位置(x,y)的左上角的位置可以用求模的方法获得,即: x=(x-1+m)%m y=(y-1+m)%m 如果所求的位置已经有数据了,将该数据填入同一列下一行的位置。这里需要注意的是。此时的x和y已经变成之前的上一行上一列了,如果想变回之前位置的下一行同一列,x需要跨越两行,y需要跨越一列,即: x=(x+2)%m y=(y+1)%m 4.运行、测试与分析 (1)程序开始运行并输入。 (2)输出结果。 (3)容错检验。

魔方7步还原方法图文并茂一看就懂

首先,破解魔方,或者说还原魔方的6个面,我们就要先了解它的结构,魔方共6色6面,每面又分为中央块(最中间的块6个)、角块(4角的块8个)和边块(4条边中间的块12个)。其中中央块只有1个面,他们是固定的结构,所以中央是红色的块,那么其他的红色都要向这个面集中。而且红色的中央块对面永远是橙色中央块(国际标准是这么规定的)。而边块有2个面2个颜色,角块则有3个面3个颜色。 接下来我们将每个面都用字母代表,

然后破解魔方功略里会用字母来说明要转动的1层或1面,以及方向:例如:R(代表右面顺时针转90度),R`(代表右面逆时针转90度),R2(代表右面顺时针转2次90度) 下面是图示: 最后要说明的是:每面的名称是相对的,例如F是前面,就是手拿魔方时面向自己的一面,若把模仿旋转到另一面,那么就有新的一面成为前面。 好了 下面就让我们尝试下7步将魔方还原吧!

1.先将中间是白色块的一面(有个rubiks logo的那块)对着上面,然后在顶部做出白十字,就是其他颜色的块都到相应的位置(小复杂,见图示,注意上面标的口诀哦,照做无误) 2.然后是将白色的角块归位(秘籍说的很复杂,还是看图比较容易理解啦)

3.然后让中层边块归位。 把白色面转向下,找出红绿边块,若红绿边块在顶层则按顺时针方向转动顶层,直到边块与图上的1个情况相同,在按照口诀转动魔方,使边块归位。若红绿边块在中间某层,但位置错误或颜色错误,则先使红绿边块在右前方的位置,再重新按照下面其中一个次序旋转1次。

4.然后将顶层(应该是黄色)边块调整向上,做出黄十字。若按照口诀转动1次后,顶层仍未出现黄色十字,可重复按口诀转动,直到黄色十字出现为止。 5.然后将魔方黄色角块调整到十字周围,有点难度,看口诀提示吧。

(纯c语言运行通过)任意阶魔阵算法及规律

任意阶魔方阵算法 20012-05-30 22:51:00| 分类:魔阶作者:王狼杰 我一直就对魔方阵很感兴趣,特别是知道了奇数阶魔方阵的罗伯特算法后,就特别想知道偶数阶魔方阵应有什么算法。当时书上说偶数阶魔方阵比较复杂。都没有什么说明。因此这个问题一直搁在我心里很久,已差不多快忘记了。今天突然又想到了这个问题。于是我开始在网上搜寻,看能不能找到什么好的算法。记得在高中的时候,我就做过魔方阵,当时我从三阶一直做到过八阶方阵,不过用的是人工的方法。到大学的时候我知道了罗伯特算法后,我就用程序将算法写了出来。于是我今天准备把偶数阶的魔方阵也写出来。在网上终于找到了一个比较好的算法。将该算法用C写了出来。供大家分亨。 1、奇数阶幻方 n为奇数(n=3,5,7,9,11……) (n=2*k+1,k=1,2,3,4,5……) 奇数阶幻方最经典的填法是罗伯特法(也有人称之为楼梯方)。填写方法是这样: 把1(或最小的数)放在第一行正中;按以下规律排列剩下的n*n-1个数: (1)、每一个数放在前一个数的右上一格; (2)、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列; (3)、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行; (4)、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内; (5)、如果这个数所要放的格已经有数填入,处理方法同(4)。 这种写法总是先向“右上”的方向,象是在爬楼梯。

2、双偶阶幻方 n为偶数,且能被4整除(n=4,8,12,16,20……) (n=4k,k=1,2,3,4,5……) 先说明一个定义: 互补:如果两个数字的和,等于幻方最大数和最小数的和,即n*n+1,称为互补。 先看看4阶幻方的填法:将数字从左到右、从上到下按顺序填写: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 这个方阵的对角线,已经用蓝色标出。将对角线上的数字,换成与它互补的数字。 这里,n*n+1 = 4*4+1 = 17; 把1换成17-1 = 16;把6换成17-6 = 11;把11换成17-11 = 6……换完后就是一个四阶幻方。 16 2 3 13 5 11 10 8 9 7 6 12 4 14 1 5 1 对于n=4k阶幻方,我们先把数字按顺序填写。写好后,按4*4把它划分成k*k个方阵。因为n是4的倍数,一定能用4*4的小方阵分割。然后把每个小方阵的对角线,象制作4阶幻方的方法一样,对角线上的数字换成互补的数字,就构成幻方。下面是8阶幻方的作法:(1) 先把数字按顺序填。然后,按4*4把它分割成2*2个小方阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

最佳魔方口诀

玩转六面魔方 本文适用于会玩者忘了怎么玩或怕忘了玩法的魔方玩家,对于生手和高手不适用。 本文口诀所依照的方案是较繁琐但直观的方案。思路是先做底面(底层),然后是中层,然后是顶层十字,然后是顶层对角,然后是顶层同色,然后是顶层翻棱(收工)。 本口诀体系中,采有两套方案表示(纯个人习惯,如果你不喜欢,可以选择不阅读本文,或阅读后修改口令(令为别字,应是诀))。 一是本人约定的,即上下左右顺逆。 二是辛马斯特(David Singmaster)的算子表示法。 口诀说明: 上指右侧面顺时针90度,下指右侧面逆时针90度。左指顶面顺时针90度,右指顶面逆时针90度。顺指正面顺时针90度,逆指正面逆时针90度。 辛马斯特(David Singmaster)的算子表示法说明(参引): 美国魔方大师辛马斯特的算子表示法: 以英文Up(上)、Down(下)、Front(前)、Back(后)、Left(左)、Right(右)的第一个字母分别来表示魔方的上、下、前、后、左、右六个面,即U(上)、D(下)、F(前)、B(后)、L(左)、R(右)。当旋转魔方的右层时,从右侧看,若按顺时针方向转动90°,则用R表示这一旋转动作,若按反时针方向转动90°,则用R'表示这一旋转动作,若按顺时针方向转动180°,则用R2来表示。另外,将夹层的运动RL'简单记作Rs(表示左右两层同时以右层为基准的顺时针方向转动90°),并将夹层的运动RL简单记作Ra(即右层顺时针转90°,左层则与之反方向旋转90°),而(RsFs)3则表示将RsFs的动作重复做3次。 按Singmaster的算子表示法,我的上下左右顺逆,对应为: 上R下R' 左U 右U' 顺F 逆F' Step 1.基地 Objective(or Consequence):一面颜色相同,且其周边4个侧面的所有块颜色,均与相应侧面的中心块颜色一致。通俗地说,就是一层颜色很整齐。 Action:先对底面十字,注意,十字的两面色块,要与其对应面中心的单色块的颜色一致,否则不合格。 对十字,看着对吧。这个也可以有口诀,但为了减小记忆负担,这个操作由玩家自行了断还是。对四角的口诀下面说明。 对底层4角(移基面角块)的口诀: L'B'L(口诀1,读法:L逆B逆L,L的读法请参阅英文字典)。正对基面时,基面左上角移到上层的右上角;上层的左上角,移到基面的左上角。 当上层左上角块的左面色为基色时,使用此口诀会将它移到正确位置。否则多做几次这个口诀(前提是上层左上或左下有一面色为基色)。 注意使用B (后面顺时针90度)来调整上层右上角块到左上角。 完成这步后,需要将此层(基面)置下,这个层本文称为基地。以后所有步骤,都是基于不破坏基地的前提的。

魔方阵解答

P141 5.求Sn=a+aa+aaa+…+aa ….a 之值,其中a 是一个数字。如:2+22+222+2222(n=4),n 由键盘输入。 7.求 ∑∑∑===++100 150110 1 2 1k k k k k k

P168 7.输出魔方阵,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。

解:魔方阵中各数的排列规律如下: 1.)将1放在第一行中间的一列。 2.) 从2开始直到n×n止各数依次按下列规律存放:每一个数存放的行比前一个数的行数减 1,列数加1(如三阶魔方阵,5在4的上一行,后一列)。 3)如果上一数的行数为一,则下一个数的行数为n(指最下一行)。例如,1在第一行,则2应放在最下一行,列数加1。 4)当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如,2在第3行最后一列,则3应放在第2行第1列。 5)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例:4应放在第一行第二列,但位置已被1占据,所以4就放在3的下面。由于6是第一行第三列(即最后一列),故7放在6下面。 N-S图:

10.有一篇文章,共有3行文字,每行80个字符。要求分别统计出其中英文大写字母、小写 字母、数字、空格,以及其他字符个数。

解:N-S图 程序:

P218 4.编写一个函数,使给定的一个二维数组(3×3)转置(行列互换) 10.写一个函数,输入一行字符,将此字符串中最长的单词输出。 分析:单词是由全字母组成的字符串,程序中设longest函数的作用是找最长单词的位置。此函数的返回值是该行字符中最长函数单词的起始位置。Longest N-S图

魔方阵问题

实验报告 实验课名称:数据结构实验三 实验名称:魔方问题 班级:20130612 学号:13姓名:李寅龙时间:2014-5-25 一、问题描述 ①问题描述 魔方阵是一个古老的智力问题,它要求在一个m×m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所示。 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 图1 五阶魔方阵示例 ②基本要求 ●输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判 断,如m有错,能给出适当的提示信息。 ●实现魔方阵。 ●输出魔方阵。 二、数据结构设计 1.将1放在第一行中间一列。 2.从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1。 3.如果上一个数的行数为1,则下一个数的行数为n,列数加1。如果上一个数的列数的n时,下一个数的列数为1,行数减1。 4.如果按上面的规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。 三、算法设计 (1)数据输入 输入小于10的魔方阵的阶数 printf("输入小于10的奇数m:"); scanf("%d",&m); (2)对输入的阶数进行魔方填充 int a[N][N]={0},i=0,j,k; /*先令所有元素都为0*/ j=(m-1)/2; i=0; for(k=1;k<=m*m;) /*开始处理*/ {

if((i<0)&&(j==m)) /*前一个数是第一行第m列时,把下一个数放在上一个数的下面*/ { i=i+2; j=j-1; } else if(i<0) /*当行数减到第一行,返回到最后一行*/ i=m-1; else if(j>m-1) /*当列数加到最后一行,返回到第一列*/ j=0; else if(!a[i][j]) { /*如果该元素为0,继续执行程序*/ a[i][j]=k; k++; i=i-1; j=j+1; } else /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/ { i=i+2; j=j-1; } (3)输出 printf("魔方如下:\n"); for(i=0;i

魔方口诀方法

魔方口诀方法 当你拿到一个混乱的魔方时,你可能不知道从何入手,但首先要记住的是,魔方每个面的中心块是固定的,不能移动的。下面就分步骤介绍一下魔方的还原方法。 第一步还原其中一面。这步是最初级的,随便找一面你喜欢的颜色,直接还原成一个完整面。

第二步四侧面底层和中心块还原 以第一步还原的完整面为底,还原四侧面的底层和中心块形成的梯形,如下图所示。在第二步完成的同时,第一步完成的一面仍保持完整。 (以上两步没有口诀,所以想完成魔方还原,以上两步是最基础的,需要自行摸索练习。) 第三步四侧面下两层完整 到这步就可以用口诀的,所以先解释一下就口诀,口诀中的“加”“减”分别指的是“顺时针”和“逆时针”,第一步完成的完整面 一直作为底面,正对着自己的面为“前”。四侧面下两层完整,指的是四个侧面的下面两层还原完整,如下图所示。

第三步的口诀是:(移动的方块是侧面上层中间块,根据侧面颜色判断是向侧面中层左侧移动还是向右侧移动) 1.中左方块:上减,左减,上加,左加,上加,前加,上减,前减 2.中右方块:上加,右加,上减,右减,上减,前减,上加,前加 第四步还原顶层十字 完成第三步后,接下来就是将顶层的十字还原,完成后如下图所示。

第四步的口诀是:前加,右加,上加,右减,上减,前减 第五步四侧面顶层中方块(十字归位) 四侧面顶层中方块,也就是说四侧面最上面一层的中间的方块与中层的中心块相对应。如下图所示。 第五步的口诀是: 条件:找四侧面唯一面可以对上的,并以这面为“前”,其它面对不上。(如果有两面能对上,就用一次下面的口诀,就可以达到用口诀的条件了) 右加,上加,右减,上加,右加,上加180度,右减 第六步四侧面顶层两边方块对位(上层角归位) 四侧面顶层两边方块对位,指的四侧面上层两角的方块归位,归位并不是指颜色要对上,只要这块的颜色和所在的三个面的颜色相对应就行,如下图所示。

最容易学的新手魔方公式口诀图解教程

新魔方新手教程 前言 我们常见的魔方是3x3x3的三阶魔方,英文名Rubik's cube。是一个正6 面体,有6种颜色,由26块组成,有8个角块;12个棱块;6个中心块(和中心轴支架相连)见下图: (图1) 学习魔方首先就要搞清它的以上结构,知道角块只能和角块换位,棱块只能和棱块换位,中心块不能移动。 魔方的标准色: 国际魔方标准色为:上黄-下白,前蓝-后绿,左橙-右红。(见图2)注:(这里以白色为底面,因为以后的教程都将以白色为底面,为了方便教学,请都统一以白色为准)。 (图2) 认识公式 (图3)(图4) 公式说明:实际上就是以上下左右前后的英文的单词的头一个大写字母表示

(图5) (图6)

(图7) (图8)

步骤一、完成一层 首先要做的是区分一层和一面:很多初学者对于“一面”与“一层”缺乏清楚的认识,所以在这里特别解释一下。所谓一层,就是在完成一面(如图2的白色面)的基础上,白色面的四条边,每条边的侧面只有一种颜色,图(2). 如图(1)中心块是蓝色,则它所在面的角和棱全都是蓝色,是图(2)的反方向 图(3)和(4)则是仅仅是一面的状态,而不是一层! (1)(2) (3)(4) 注:图(2)和(4)分别是图(1)和(3)的底面状态 想完成魔方,基础是最重要的,就像建筑一样,魔方也如此,基础是最重要的。 由于上文提到过中心块的固定性,这一性质,在魔方上实质起着定位的作用,简单的说就是中心块的颜色就代表它所在的面的颜色。 一、十字(就是快速法中的CROSS) 第一种情况如图所示: (橙色下面颜色为白色,为方便观察,特意翻出颜色) 公式为R2 第二种情况如图所示: (白色下面颜色为橙色,为方便观察,特意翻出颜色) 橙白块要移到上右的位置,现在橙白块在目标位置的下面。但其橙色片没有和橙色的中 心块贴在一起。为此我们先做D’F’即把橙色粘在一起,接着

求魔方阵的十种算法

求魔方阵的十种算法 魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。 如3×3的魔方阵: 8 1 6 3 5 7 4 9 2 魔方阵的排列规律如下: (1)将1放在第一行中间一列; (2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列); (3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1; (4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列; (5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面; 1居上行正中央 依次右上切莫忘 上出框时往下写 右出框时左边放 右上有数下边写 右上出框也一样 一、魔方阵的简介 1.何谓矩阵?矩阵就是由方程组的系数及常数所构成的方阵。把用在解线性方程组上既 方便,又直观。 2.何谓n阶方阵?若一个矩阵是由n个横列与n个纵行所构成,共有个小方格,则称这 个方阵是一个n阶方阵。 3.何谓魔方阵?4 9 2 3 5 7 8 1 6定义:由n*n个数字所组成的n阶方阵,具有各对角线, 各横列与纵行的数字和都相等的性质,称为魔方阵。而这个相等的和称为魔术数字。若填入的数字是从1到n*n,称此种魔方阵为n阶正规魔方阵。 4.最早的魔方阵相传古时为了帮助治水专家大禹统治天下,由水中浮出两只庞大动物背

魔方公式口诀

关于魔方,你需要知道: 无论怎么转,每一个面的最中间的块[图:1-面中心块]是固定不动的。所以每一面的中心块颜色决定了该面的颜色。 无论怎么转,位于顶角的有三种颜色的块[图:2-顶角块]永远会在某一个顶角;位于棱中间的有两种颜色的块[图:2-棱中间块]永远会在某一个棱的中间。 所谓的公式,就是用一定的套路告诉你每个面该怎么转。所用到的字母U D L R F B 分别代表魔方的上下左右前后6个面。如上图(后方那面(B)一般不用,所以没有展示)。在字母后加一个撇('),表示把该面逆时针旋转,不加撇的就是顺时针转。如R’表示右侧面逆时针转。 第一步首面十字[2014/6/18更新]这一步不太懂的请拉到最后看视频实例哟~ 这里以白色面为例。想要转出一个面,最先要转出一个十字形。但是十字也不是随意哪个白色块都可以的。在转出十字的同时,必须保证上层的棱中间块的颜色与该面相同。这个步骤需要自己稍微摸索。如下图:

P.S. 第一步果然很重要,很多同学还是不懂。我前几天也尝试把第一步详细写出来,可是分布情况实在太多,写着写着自己都绕晕了。而且第一步一旦你上手之后就会发现非常的简单。所以请原谅我这根懒惰的神经,这一步就不详细图解了,大家请根据下面那张图和文字摸索一下吧: 首先要先定位你要复原的棱中心块。 比如说,面朝你的一面是蓝色的,最上层是白色的,于是你就要先找到[白-蓝]块到底跑哪去了,然后把它复原到原位,即下图中标有黄色阴影的1号位置。 [白-蓝]块归位以后,转下魔方顶层,让[白-蓝]块中的蓝色和蓝色面中心块衔接,接着看蓝色面右边的面。 如图,从面中心块可以知道,蓝色面的右面是红色面,(好吧这里实在忍不住了吐个槽,做图的时候貌似把红蓝色搞反了,大家...将就自动脑补一下吧.....( ̄▽ ̄")),所以要把[白-红]块转到2号位置。 当你找到迷失的[白-红]块后,在尽量不转顶层的情况下,把它转到2号位置。

数阶幻方的编排方法

精心整理 奇数阶幻方的编排方法 简便易学的编排方法。 一、九子排列法 宋朝数学家杨辉在《续古摘奇算法》中,总结“洛书”幻方的编排方法时说:三阶幻方的编排方法是“九子排列,上下对易,左右相更,四维挺出”。 这四个句子是什么意思呢?我们通过下面的一组图来加以理解。 先画出一个3×3的“九宫格”,并在第二列上、下方和第二行左、右边各添加一个虚线格子,把1~9这九个数字按顺序写在如上图所示的三排斜线上,然后上、下对调,左右交换,(因为我 1 2 3 图1) 4 然后把5 5 1 下面以五阶幻方为例,再介绍一种奇数阶幻方的编排方法。步骤如下: ①先画出一个5×5(五行五列)的方格,在方格的四周画出凸阶梯式的虚线方格(如下图1) ②把1~25这二十五个数按斜行方向从左到右依次填入图中(如上图2); ③以3、15、23、11四个数为顶点(实际上就是五阶幻方的四个顶点)画出一个正方形; ④把正方形外面凸出的虚线方格中的数按“上移下,下移上;左移右,右移左”的方法,全部平移5格到对应部分的方格中,擦掉虚线格子,就得到一个五阶幻方(见下图)。 这种编排幻方的方法叫“巴舍法”,也叫平移补空法,它和“罗伯法”一样,也适用于一切的奇数阶幻方的编排。 需要提醒大家注意的是,在步骤②中,填写1~25这二十五个数时,可以从左向右上填写,也可以从右向左上填写,或者从上向右下填写,还可以从上向左下填写,其移动后的结果都是一个五阶幻方,同学们可以自己动手试一试。

另外,编排n 阶幻方时,不一定非要从1开始,只要是这些数能构成等差数列就可以了。 练习(一定要完成的哦) 1、使用“罗伯法”将4~12编排一个三阶幻方。 2、用“罗伯法”将21、31、32、41、4 3、61、121、125、12 7编成一个三阶幻方。 3、使用“巴舍法”将1~49编排一个七阶幻方。 双偶数阶幻方的编排方法 一、中心对称交换法 例1、用1~16这十六个数编排一个四阶幻方(四行四列)。 【分析与解答】用1至16编排一个四阶幻方,就是把1~16这十六个数填入四行四列的方格 34。 是3412+16=40(即2与3,+14+16=58(即8与12例如2又如,9称交换就可以直接得到四阶幻方,把这种编排双偶数阶幻方的办法叫“中心对称交换法”。 由例1可以看到,用“中心对称交换法”编排四阶幻方的主要步骤归纳如下: ①把1~16按顺序排成四阶自然方阵; ②四阶自然方阵中对角线上的八个数不动,作为四阶幻方两条对角线上的数; ③把四阶自然方阵中对角线以外的数作中心对称交换。 运用“中心对称交换法”不仅可以编排四阶幻方,而且可以编排任意的双偶数阶幻方。 例2、用1~64这六十四个数编排一个八阶幻方(八行八列)。 【分析与解答】编排步骤如下: ①把1至64按顺序填入8×8的方格子中,排成八阶自然方阵;(见左下图) ②把八阶自然方阵分成四个四阶自然方阵(左下图粗线条),每个四阶自然方阵分别画出对角

自整理三阶魔方口诀

最简三阶魔方口诀与图解 第一步对好(白色)面十字架(对好底面棱块) 在6此步完成后效果图 种颜色中选出一种你所喜爱的颜色做底面,然后,给那个有此种颜色的中心方块的平面上4个边缘方块定位和定向(即底面边缘)。 以白色为例,将底面白色暂时置于上面,如果幸运的话,也许其中的一两个白方块碰巧已经在它的正确位置上,如果白色在底面,不管颜色将至旋到顶面,然后中层有没有白色块,将上层十字空缺位置转于中层白块平行处,将中层白块转到顶面。 然后将没有对好侧面中心颜色的白块翻到底面,转动最下层,让其侧面颜色迅速与中间颜色对齐再翻到顶面,同样方法将白色面十字架完成。 补充:当我们完成这个白色十字架的时候,我们每个人手上的魔方除了十字是一样的之外,其他的排列可能都是不一样,比如像下面的图,除了白色十字外还多了一个白色角块,有的可能还会有2个、3个,甚至4个白色角块都在一起了,这样算不算完成第一步呢?当然算!但是,我们需要注意的是:我们这一步最终目标是对好这个白色十字架,所以我们不用管其他角色块是什么颜色,只要对好白色十字就可以了。 第二步对好(白色)底面形成一个倒T形(对好四个底面角块) 第二步完成效果图 目标是要对好白色底面的顺序并和中间层中心块形成一个倒T形,如上图所示。每个边的颜色和中心块颜色是相同的,看起来是个T字型,所以这一步也就叫倒T型。在后面我们还是需要用白色做底为参考。 如上图所示,A-F代表白色面,每个块还有其它两种颜色。所以白色角块正确的位置就是在另外两种颜色面之间的角块。 利用错开、借位、还原等方法很容容易A、B、C、D四个位置的角块归位。 对于E和F这两种情况,大家细心看一下就可以看到,只要借用一下棱块,再水平转开,还原棱块就就可以把E(或F)转到底部就会变成A或B。 初始状态,白蓝红小角块应该放在蓝红所夹的那个角(目标位置)的下面,不能放错哦。下一步要旋转

魔方阵

课程设计报告 魔方阵 学生姓名: 专业: 班级: 学号: 指导教师: 2017年4月12日

目录 一、实验题目 (2) 二、实验目的 (2) 三、实验要求 (2) 四、实现过程 (3) 1、总体设计: (3) 2、详细设计: (5) 3、调试分析: (9) 4、运行结果: (9) 5、实验总结: (10) 五、参考文献 (10) 六、附录 (10)

一、实验题目 魔方阵 二、实验目的 本次课程设计的主要目的是综合运用所学的数据结构知识解决奇数魔方阵问题,侧重对二维数组等相关内容的综合应用,使自己能进一步熟悉掌握数据结构的基础知识,进一步提升自己的解决问题和编程调试能力,为后续专业课程的学习打下良好的基础。 三、实验要求 1.[问题描述]: 魔方阵时一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如下图所示: 2.[设计要求]:

(1)输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出适当的提示信息 (2)实现魔方阵 (3)输出魔方阵 3.[数据结构] 本课程设计使用的数据结构是数组。 四、实现过程 1、总体设计: 1.主流程图:

2.填数流程图

2、详细设计: 1.奇数阶幻方(劳伯法) 填写的方法是:把1(或最小的数)放在第一行正中;按以下规律排列剩下的(n×n-1)个数: (1)每一个数放在前一个数的右上一格; (2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列; (3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行; (4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在底行且最左列; (5)如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。 2.以3*3魔方阵为例,说明其填数过程,如下图: (a)(b)(c) (d)(e)(f)

魔方口诀技巧

怎样玩魔方(转录) 魔方曾被誉为世界三大智力玩具之一,不过现在我不敢这么说了。什么?另外 两个是什么?你可记住了:那是我们中国的九连环和捉放曹啊! 魔方可以拆开。废话!不过……你拆开过吗?如果没有,赶快把魔方一块一块 地卸下来,嘿嘿嘿,是不是有一种打DOOM怪物的感觉?卸下来了吗?可以看到, 除了骨架上的六个不同颜色的中心积木外,还有8个角上的积木和12个棱上的积 木。中心积木只有一种颜色,棱上的积木有两种颜色,角上的积木有三种颜色。 不管怎么说,没有两块积木是完全相同的。骨架上的中心积木是不能动的,所以中 心积木与中心积木的相对位置是确定不变的,所以角上棱上的积木的正确位置也是 不变的。例如一个红黄蓝色的角积木,它的正确位置就在红黄蓝中心积木对应面的 角上。我们的任务就是把棱积木、角积木转到它们自己的位置上。 废话少说,快来观摩一下我的规划图吧: 图1 从现在起我们就要开始玩魔方了,现在的任务是完成魔方的一面。 首先选择你要玩的面颜色,在这里我选择兰色进行教学,因为我喜欢兰色^_^, 我们将该颜色的中心积木所在的面称为基面。 图2 图3 图4

为了避免玩家转来转去找不到魔方的方向了,我们统一规定,魔方摆放如图2所示,另外在图3中我们要将外面的兰色块转入基面的黑色块位置时,却不能影响阴影积木,这也是玩魔方的难点。对于其他没着色的积木,都是些无关紧要的积木,可不去理会,把注意力集中在基面外面的操作块、操作块的目标位置和不可受到影响的积木上。(注:在操作的步骤中,阴影积木可以移动,但要保证步骤完毕后,阴影积木无变化) 对于魔方一面的完成,我们是一个一个操作块地完成的,饭也是一口一口地吃嘛!转时,一定要找准操作块的真正目标所在,要注意操作块的附加颜色,否则失败。如图4,黄蓝色块与绿蓝色块颠倒,所以兰色一面成功了也没有用。 下面是一些最基本的将操作块转入基面的功夫,可要认真揣摩呀! 图5 图6 简要说明:图中阴影块是目标位置,注意哟,我可没有标记不可受影响的积木哟。另外,要注意操作块相对于目标位置的区别,不同的位置用不同的方法。如图6所示,基面外兰色标记的块,都可以通过转动使其到达A位置或者B位置,然后再用1方法完成到达目的位置的任务。 图7 图8 当目标块在背面时,可以通过图7这三步将目标块转到侧面来,然后转到A位置,用1方法完成到达目的位置的任务。触类旁通,如面图8所示,基面外兰色标记的块,都可以通过转动使其到达A位置,然后再用2方法完成到达目的位置的任务。

偶数阶魔方阵构造方法

偶数阶魔方阵构造方法 2009-11-03 10:23:40| 分类:其他|字号大中小订阅 (1)n = 4k(4的整数倍时) (1) 先将整个方阵划分成k*k个4阶方阵,然后在每个4阶方阵的对角线上做记号 (2) 由左而右、由上而下,遇到没有记号的位置才填数字,但不管是否填入数字,每移动一格数字都要加1 (3) 自右下角开始,由右而左、由下而上,遇到没有数字的位置就填入数字,但每移动一格数字都要加1 例:k=1时构造完如下 16 2 3 13 5 11 10 8 9 7 6 12 4 14 1 5 1 (2)n = 4k + 2 本法填制魔方阵时,先将整个方阵划成田字型的四个2 k + 1阶的奇数阶小方阵,并以下法做注记: 1,右半两个小方阵中大于k+2的列。 2,左半两个小方阵中( k + 1 , k + 1 )的格位。 3,左半两个小方阵中除了( 1 , k + 1 )的格位之外,小于k +1的列。 以奇数阶魔方阵的方法连续填制法依左上、右下、右上、左下的顺序分别填制这四个小方阵。 将上半及下半方阵中有注记的数字对调,魔方阵完成。 例:k=1时构造完如下 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 幻方阵 幻方是什么呢?如右图就是一个幻方,即将n*n(n>=3)个数字放入n*n的方格内,使方格的各行、各列及对角线上各数字之各相等。 我很早就对此非常感兴趣,也有所收获。 8 1 6 3 5 7 4 9 2 本数学模型于1999年9月26日构造。 奇阶幻方 当n为奇数时,我们称幻方为奇阶幻方。可以用Merzirac法与loubere法实现,根据我的研究,发现用国际象棋之马步也可构造出更为神奇的奇幻方,故命名为horse法。 偶阶幻方 当n为偶数时,我们称幻方为偶阶幻方。当n可以被4整除时,我们称该偶阶幻方为双偶幻方;当n不可被4整除时,我们称该偶阶幻方为单偶幻方。可用了Hire法、Strachey以及YinMagic将其实现,Strachey为单偶模型,我对双偶(4m 阶)进行了重新修改,制作了另一个可行的数学模型,称之为Spring。YinMagic 是我于2002年设计的模型,他可以生成任意的偶阶幻方。 在填幻方前我们做如下约定:如填定数字超出幻方格范围,则把幻方看成是可以无限伸展的图形,如下图: Merzirac法生成奇阶幻方 在第一行居中的方格内放1,依次向左上方填入2、3、4…,如果左上方已有数字,则向下移一格继续填写。如下图用Merziral法生成的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 loubere法生成奇阶幻方 在居中的方格向上一格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向上移二格继续填写。如下图用Louberel法生成的7阶幻方: 30 39 48 1 10 19 28 38 47 7 9 18 27 29 46 6 8 17 26 35 37 5 14 1 6 25 34 36 45 13 15 24 33 42 44 4 21 23 32 41 43 3 12 22 31 40 49 2 11 20 horse法生成奇阶幻方 先在任意一格内放入1。向左走1步,并下走2步放入2(称为马步),向左走1步,并下走2步放入3,依次类推放到n。在n的下方放入n+1(称为跳步),再按上述方法放置到2n,在2n的下边放入2n+1。如下图用Horse法生成的5阶幻方:77 58 39 20 1 72 53 34 15 6 68 49 30 11 73 63 44 25 16 78 59 40 21 2 64 54 35 26 7 69 50 31 12 74 55 45 36 17 79 60 41 22 3 65 46 37 27 8 70 51 32 13 75 56 47 28 18 80 61 42 23 4 66 57 38 19 9 71 52 33 14 76 67 48 29 10 81 62 43 24 5 一般的,令矩阵[1,1]为向右走一步,向上走一步,[-1,0]为向左走一步。则马步可以表示为2X+Y,{X∈{[1,0], [-1,0]},Y∈{[0,1], [0,-1]}}∪{Y∈{[1,0], [-1,0]},X∈{[0,1], [0,-1]}}。对于2X+Y相应的跳步可以为2Y,-Y,X,-Y,X,3X,3X+3Y。上面的的是X型跳步。Horse法生成的幻方为魔鬼幻方。 Hire法生成偶阶幻方 将n阶幻方看作一个矩阵,记为A,其中的第i行j列方格内的数字记为a(i,j)。在A内两对角线上填写1、2、3、……、n,各行再填写1、2、3、……、n,使各行各列数字之和为n*(n+1)/2。填写方法为:第1行从n到1填写,从第2行到第n/2行按从1到进行填写(第2行第1列填n,第2行第n列填1),从第n/2+1到第n 行按n到1进行填写,对角线的方格内数字不变。如下所示为6阶填写方法: 1 5 4 3 2 6 6 2 3 4 5 1 1 2 3 4 5 6

相关文档