求高手用c++程序编写一个三阶幻方,要用c++哦

求高手用c++程序编写一个三阶幻方,要用c++哦,第1张

#include "iostreamh" int main() { int magic[3][3],i=0,j=1,num; const int m=3; for (i=0;i<3;i++) for(j=0;j<3;j++) magic[i][j]=0; magic[0][1]=1; i=0;j=1; for (num=2;num<=9;num++) { if (magic[(i-1+m)%m][(j+1)%m]) i++; else { i=(i+2)%m; j=(j+1)%m; } magic[i][j]=num; } for(i=0;i<3;i++) { for (j=0;j<3;j++) { cout<<magic[i][j]<<'\t'; } cout<<endl; } return 0; }

麻烦采纳,谢谢!

幻方的定义 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为“幻 方”。我国古代称为“河图”、“洛书”,又叫“纵横图”。九宫洛书蕴含奇门遁甲的布阵之道。九宫之数源于易经中,《易经》。n阶幻方与高阶幻方, n阶幻方是由前n^2(n的2次方)个自然数组成的一个n阶方阵,其各行、各列及两条对角线所含的n个数的和相等。例子:(三阶幻方,幻和为15,)

4 9 2

3 5 7

8 1 6

三阶幻方中间必填5高次幻方是指,当组成幻方各数替换为其2,3,,k次幂时,仍满足幻方条件者,称此幻方为k次幻方。反幻方反幻方的定义:在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和不相等,具有这种性质的图表,称为“反幻方”。反幻方与正幻方最大的不同点是幻和不同,正幻方所有幻和都相同,而反幻方所有幻和都不同。所谓幻和就是幻方的任意行、列及对角线几个数之和。如下图3阶反幻方的比较。反幻方图中边框外围的数字之和就是幻和。红色为偶数,黑色为奇数。可以说反幻方是一种特殊的幻方。反幻方的幻和可以全部不同,也可以部分相同。如下图多种3阶反幻方。多种反幻方幻方的历史幻方又称为魔方,方阵或厅平方,它最早起源于我国。宋代数学家杨辉称之为纵横图。幻方的幻在于无论取哪一条路线,最后得到的和或积都是完全相同的。大约两千多年前西汉时代,流传夏禹治水时,黄河中跃出一匹神马,马背上驮着一幅图,人称「河图」;又洛水河中浮出一只神龟,龟背上有一张象征吉祥的图案称为「洛书」他们发现,这个图案每一列,每一行及对角线,加起来的数字和都是一样的,这就是我们现在所称的幻方也有人认为"洛书"是外星人遗物;而"河图"则是描述了宇宙生物(包括外星人)的基因排序规则,幻方是外星人向地球人的自我介绍另外前几年在上海浦东陆家嘴地区挖出了一块元朝时代伊斯兰教信徒所挂的玉挂,玉挂的正面写着:「万物非主,惟有真宰,默罕默德,为其使者」,而玉挂的另一面就是一个四阶幻方

关于幻方的起源,我国有“河图”和“洛书”之说。相传在远古时期,伏羲氏取得天下,把国家治理得井井有条,感动了上天,于是黄河中跃出一匹龙马,背上驮着一张图,作为礼物献给他,这就是“河图”,也是最早的幻方。伏羲氏凭借着“河图”而演绎出了八卦,后来大禹治洪水时,洛水中浮出一只大乌龟,它的背上有图有字,人们称之为“洛书”。“洛书”所画的图中共有黑、白圆圈45个。把这些连在一起的小圆和数目表示出来,得到九个。这九个数就可以组成一个纵横图,人们把由九个数3行3列的幻方称为3阶幻方,除此之外,还有4阶、5阶后来,人们经过研究,得出计算任意阶数幻方的各行、各列、各条对角线上所有数的和的公式为:S=n(n ^2+1) /2其中n为幻方的阶数,所求的数为S幻方最早记载于我国公元前500年的春秋时期《大戴礼》中,这说明我国人民早在2500年前就已经知道了幻方的排列规律。而在国外,公元130年,希腊人塞翁才第一次提起幻方。我国不仅拥用幻方的发明权,而且是对幻方进行深入研究的国家。公元13世纪的数学家杨辉已经编制出3-10阶幻方,记载在他1275年写的《续古摘厅算法》一书中。在欧洲,直到1514年,德国著名画家丢勒才绘制出了完整的四阶幻方。而在国外,十二世纪的阿拉伯文献也有六阶幻方的记载,我国的考古学家们曾经在西安发现了阿拉伯文献上的五块六阶幻方,除了这些以外,历史上最早的四阶幻方是在印度发现的,那是一个完全幻方(后面会提到),而且比中国的杨辉还要早了两百多年,印度人认为那是天神的手笔1956年西安出土一铁片板上所刻的六阶幻方(古阿拉伯数字)十三世纪,东罗马帝国才对幻方产生兴趣,但却没有什么成果直到十五世纪,住在君士坦丁堡的魔索普拉才把我国的纵横图传给了欧洲人,欧洲人认为幻方可以镇压妖魔,所以把它作为护身符,也把它叫作「Magic Square」

欧洲最早的幻方是在德国一位名画家Albrecht Dure的画里的,上面有一个四阶幻方,而这个幻方的下面两个数字正好是这幅画的制作年代(1514年)这是欧洲最古老的幻方幻方世界纪录目前我国取得不少幻方世界纪录:幻方专家李文第一位构造成功10阶标准幻立方,第一位构造出最低阶729阶五次幻方,和多项平方幻方世界纪录,幻方专家苏茂挺第一位构成功32阶完美平方幻方等提醒大家注意,任意阶幻方构造法,任意维幻方构造法,任意次幻方构造法,都早已找到不存在最大阶幻方的世界纪录之类对于各种媒体报导的幻方世界之最,很多是不实报导不存在未解最大阶数幻方幻方的种类现在的幻方种类很多,如一般幻方,对称幻方,同心幻方,完美幻方平面幻方(二维),幻立方(三维),多维幻方,平方幻方,立方幻方,高次幻方,高次多维幻方魔鬼幻方,马步幻方,多重幻方,六角幻方,双料幻方,幻环,幻圆等等特殊的幻方有反幻方,完美反幻方。幻方欣赏中国幻方网站:[1]中国幻方博客:[2]法国高次幻方网站:[3]日本多维幻方网站:[4]富兰克林的幻方:[5]九阶平方幻方: [6]十二阶完美幻方(每个2×2子矩阵和为286):12阶幻方编制幻方的程序目前利用计算机编程序,可求解出任意阶幻方(但数字位数受电脑限制,实际上只能是有限范围内的任意阶)对于某些平方幻方,高次幻方,利用计算机辅助计算,也可快速求得一次幻方,一次幻立方,一次多维幻方,甚至可用简单公式全部求得某些类型的平方幻方,甚至高次高维幻方,也可用公式求得在幻方公式求解方法,我国处于世界领先水平我国李文的高维高次幻方公式,是幻方理论中的精品吴硕辛的高次幻方理论,也可用公式求解幻方的构造在《射雕》中郭黄二人被裘千仞追到黑龙潭,躲进瑛姑的小屋。瑛姑出了一道题:数字1~9填到三行三列的表格中,要求每行、每列、及两条对角线上的和都相等。这道题难倒了瑛姑十几年,被黄蓉一下子就答出来了。

4 9 23 5 78 1 6这就是一个最简单的3阶平面幻方。因为幻方的智力性和趣味性,很游戏和玩具都与幻方有关,如捉放曹、我们平时玩的六面体,也成为学习编程时的常见问题。幻方又称纵横图、九宫图,最早记录于我国古代的洛书。据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服。后人称之为"洛书"或"河图",又叫河洛图。南宋数学家杨辉,在他著的《续古摘奇算法》里介绍了这种方法:只要将九个自然数按照从小到大的递增次序斜排,然后把上、下两数对调,左、右两数也对调;最后再把中部四数各向外面挺出,幻方就出现了。 (摘自《趣味数学辞典》)最简单的幻方就是平面幻方,还有立体幻方、高次幻方等。对于立体幻方、高次幻方目前世界上很多数学家仍在研究,现在只讨论平面幻方。对平面幻方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式)⑴ N 为奇数时,最简单(1) 将1放在第一行中间一列;(2) 从2开始直到n×n止各数依次按下列规则存放:按 45°方向行走,如向右上每一个数存放的行比前一个数的行数减1,列数加1(3) 如果行列范围超出矩阵范围,则回绕。例如1在第1行,则2应放在最下一行,列数同样加1;(4) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。⑵ N为4的倍数时采用对称元素交换法。首先把数1到n×n按从上至下,从左到右顺序填入矩阵然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对称交换,即a(i,j)与a(n-1-i,n-1-j)交换,所有其它位置上的数不变。(或者将对角线不变,其它位置对称交换也可)

6

百度文库VIP限时优惠现在开通,立享6亿+VIP内容

立即获取

幻方的概念

幻方的定义 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为“幻 方”。我国古代称为“河图”、“洛书”,又叫“纵横图”。

九宫洛书蕴含奇门遁甲的布阵之道。九宫之数源于易经中,《易经》。

n阶幻方与高阶幻方, n阶幻方是由前n^2(n的2次方)个自然数组成的一个n阶方阵,其各行、各列及两条对角线所含的n个数的和相等。例子:(三阶幻方,幻和为15,)

第 1 页

4 9 2

3 5 7

8 1 6

输出成这样的最主要原因是 printf("%2d",a[20][20]); 这句,

你输出的是nn个a[20][20]的值,并且a[20][20]由于未赋值所以系统随机给了一个值,应该把a[20][20]改为a[i][j],同时%2d后最好加个空格。

但是光这么改结果还是不对,问题出在这句if (k%n==0) j=j-1;

LZ可以自己模拟一下n=3的情况,同时加这么一句实时监测程序运行的情况:printf("(%d,%d) %d\n",i,j,k-1); ,对比后可以发现在k=3 j=1时,会发生j=j-1=0的情况,也就是超过左界限了。所以这句应改为:if (k%n==1) j=j-1;

还有一个小缺点是最后一句while (i!=0),没什么用,可以去掉,或者在前面某处加个"do"。

改完后应该就没什么问题了,请LZ验收~

下面的够详细了吧

奇阶幻方

当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 16 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

6 5 3 4 2 1

6 2 4 3 5 1

1 5 4 3 2 6

如下所示为8阶填写方法(转置以后):

1 8 1 1 8 8 8 1

7 2 2 2 7 7 2 7

6 3 3 3 6 3 6 6

5 4 4 4 4 5 5 5

4 5 5 5 5 4 4 4

3 6 6 6 3 6 3 3

2 7 7 7 2 2 7 2

8 1 8 8 1 1 1 8

将A上所有数字分别按如下算法计算,得到B,其中b(i,j)=n×(a(i,j)-1)。则AT+B为目标幻方

(AT为A的转置矩阵)。如下图用Hire法生成的8阶幻方:

1 63 6 5 60 59 58 8

56 10 11 12 53 54 15 49

41 18 19 20 45 22 47 48

33 26 27 28 29 38 39 40

32 39 38 36 37 27 26 25

24 47 43 45 20 46 18 17

16 50 54 53 12 11 55 9

57 7 62 61 4 3 2 64

Strachey法生成单偶幻方

将n阶单偶幻方表示为4m+2阶幻方。将其等分为四分,成为如下图所示A、B、C、D四个2m+1阶奇数幻方。

A C

D B

A用1至2m+1填写成(2m+1)2阶幻方;B用(2m+1)2+1至2(2m+1)2填写成2m+1阶幻方;C用2(2m+1)2+1至3(2m+1)2填写成2m+1阶幻方;D用3(2m+1)2+1至4(2m+1)2填写成 2m+1阶幻方;在A中间一行取m个小格,其中1格为该行居中1小格,另外m-1个小格任意,其他行左侧边缘取m列,将其与D相应方格内交换;B与C接近右侧m-1列相互交换。如下图用Strachey法生成的6阶幻方:

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

Spring法生成以偶幻方

将n阶双偶幻方表示为4m阶幻方。将n阶幻方看作一个矩阵,记为A,其中的第i行j列方格内的数字记为a(i,j)。

先令a(i,j)=(i-1)n+j,即第一行从左到可分别填写1、2、3、……、n;即第二行从左到可分别填写n+1、n+2、n+3、……、2n;…………之后进行对角交换。对角交换有两种方法:

方法一;将左上区域i+j为偶数的与幻方内以中心点为对称点的右下角对角数字进行交换;将右上区域i+j为奇数的与幻方内以中心点为对称点的左下角对角数字进行交换。(保证不同时为奇或偶即可。)

方法二;将幻方等分成mm个4阶幻方,将各4阶幻方中对角线上的方格内数字与n阶幻方内以中心点为对称点的对角数字进行交换。

如下图用Spring法生成的4阶幻方:

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

YinMagic构造偶阶幻方

先构造n-2幻方,之后将其中的数字全部加上2n-2,放于n阶幻方中间,再用本方法将边缘数字填写完毕。本方法适用于n>4的所有幻方,我于2002年12月31日构造的数学模型。YinMagic法可生成6阶以上的偶幻方。如下图用 YinMagic法生成的6阶幻方:

10 1 34 33 5 28

29 23 22 11 18 8

30 12 17 24 21 7

2 26 19 14 15 35

31 13 16 25 20 6

9 36 3 4 32 27

魔鬼幻方

如将幻方看成是无限伸展的图形,则任何一个相邻的nn方格内的数字都可以组成一个幻方。则称该幻方为魔鬼幻方。

用我研究的Horse法构造的幻方是魔鬼幻方。如下的幻方更是魔鬼幻方,因为对于任意四个在两行两列上的数字,他们的和都是34。此幻方可用YinMagic方法生成。

15 10 3 6

4 5 16 9

14 11 2 7

1 8 13 12

罗伯法:

1居上行正中央,依次排开右上方。

右出格时写最左,上出格时写最下

每逢几个落一行(几个是几几的方阵中的几)

以下是用TC写的填幻方的程序代码适用于16阶以内的幻方

#include "stdioh"

main()

{int n,i,j,k,x,y;

char cn;

static int t[16][16];

loop: printf("输入幻方阶数 n (0<n<16):");

scanf("%d",&n);

if((n%2==0)||(n<0)||(n>15))

{printf("此数不能构成幻方 \n");

goto loop;

}

else

{j=1;

k=(n+1)/2;

t[j][k]=1;

x=j;

y=k;

for(i=2;i<(nn+1);i++)

{j=j-1;

k=k+1;

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

{j=j+2;

k=k-1;

}

else

{if(k>n) k=1;

else if(j<1) j=n;

}

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

else

{j=x+1;

k=y;

t[j][k]=i;

}

x=j;

y=k;

}

}

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

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

{printf("%4d",t[j][k]);

if(k==n) printf("\n");

t[j][k]=0;

}

getchar();

printf("继续吗");

cn=getchar();

if(cn=='y') goto loop;

}

结果如下

47 58 69 80 1 12 23 34 45

57 68 79 9 11 22 33 44 46

67 78 8 10 21 32 43 54 56

77 7 18 20 31 42 53 55 56

6 17 19 30 41 52 63 65 76

16 27 29 40 51 62 64 75 5

26 28 39 50 61 72 74 4 15

36 38 49 60 71 73 3 14 25

37 48 59 70 81 2 13 24 35

以上就是关于求高手用c++程序编写一个三阶幻方,要用c++哦全部的内容,包括:求高手用c++程序编写一个三阶幻方,要用c++哦、低阶幻方与高阶幻方的区别、请问这个程序哪里错了(求奇数幻方)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9351833.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存