奇数幻方

奇数幻方,第1张

用楼梯法最快。

奇数幻方最经典的填法是罗伯特法(也有人称之为楼梯方)。填写方法是这样:

把1(或最小的数)放在第一行正中; 按以下规律排列剩下的n*n-1个数:

(1)、每一个数放在前一个数的右上一格;

(2)、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;

(3)、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;

(4)、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;

(5)、如果这个数所要放的格已经有数填入,处理方法同(4)。

这种写法总是先向“右上”的方向,象是在爬楼梯。

需讨论,可以百度嗨我。

有几种方法:

(1)当n为奇数时,我们称幻方为奇阶幻方。可以用Merzirac法与loubere法实现,根据我的研究,发现用国际象棋之马步也可构造出更为神奇的奇幻方,故命名为horse法。

horse法生成奇阶幻方 先在任意一格内放入1。向左走1步,并下走2步放入2(称为马步),向左走1步,并下走2步放入3,依次类推放到n。在n的段局下方放入n+1(称为跳步),再按上述方法放置到2n,在2n的下边放入2n+1。

(2)Merzirac法生成奇阶幻方 在第一行居中的方格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向下移一格继续填写。

(3)loubere法生成奇阶幻方 在居中的方格向上一格内放1,依次向右上方填入2、3、4…,如果右上方缓拍已有数字,则向上移二格继续填写。

(4)罗伯法:

1居上行正中央,仿次斜填莫相忘,上出框时往下填,

右出框时左边放,排重便在下格填,右上排重一个样。

(与罗伯握哪让法一样)3阶幻方解法 :

戴九履一,四二为肩,三七为腰,八六为足,五居中央。

8 1 6

3 5 7 3阶幻方

4 9 2

奇数阶魔方阵(幻尘败方阵)的生成,方法较多,Yidie教授于2007-6-15在算法设计栏目中,发表的“[原创]奇袭友数幻方阵生成打印程序”,是属于右下方斜行法。我也转载过一个右上方斜行法的程序。这里将刚刚学会的控件数组的添加,用在奇数魔方阵生成程序上,加上个Timer,让它动拍兄槐态显示:如何右上方斜行布阵的。右上方斜行法布阵规则,参见算法设计中我转载的程序。敬请大侠高手给出改进意见!程序代码如如下: Dim n As Integer, i As Integer, j As Integer, k As Integer Private Sub Command2_Click() Dim m As Integer For m = 0 To n * n - 1 Label2(m).Visible = False Next m k = 0: i = 0: j = n \ 2 Label2(k).Top = i * (11000 / n) Label2(k).Left = j * (12000 / n) Label2(k).Visible = True Timer1.Enabled = True End Sub Private Sub Form_Load() List1.Selected(0) = True Command2.Enabled = False '布阵命令失效 End Sub Private Sub list1_click() '列表框中选择魔方阵的阶数,布阵命令失效 Command2.Enabled = False End Sub Private Sub command1_click() '“生成”命令过程代码 For i = 1 To n * n - 1 Unload Label2(i) Next i n = List1.Text For i = 1 To n * n - 1 Load Label2(i) Next i For i = 0 To n * n - 1 With Label2(i) .Top = (i \ n) * (11000 / n) .Left = (i Mod n) * (12000 / n) + 100 .Width = 11000 / n .Height = 10000 / n .Caption = i + 1 .BackColor = RGB(255, 0, 0) .FontSize = 360 / n .Visible = True End With Next i Command2.Enabled = True End Sub Private Sub timer1_timer() k = k + 1 If k <n * n Then If k Mod n = 0 Then i = i + 1 Else i = IIf(i = 0, n - 1, i - 1) j = IIf(j = n - 1, 0, j + 1) End If Label2(k).Top = i * (11000 / n) Label2(k).Left = j * (12000 / n) + 100 Label2(k).Visible = True Else Timer1.Enabled = fase End If End Sub Private Sub command3_click() Unload Me End Sub

求采纳

//分析:魔方阵有如下规律:

// 1:自然数1总是在方阵第一行当中一列上。

// 2:后续的自然数在当前数的右上方,

// 1)如果是在第一行则行数变为第n行列数加1 ;

// 2)如果是在最后一列,行数减1,列数为第1行。

// 3)如果后续的数所处位置已有数,则行数加1,列数不变。

/******************************************************************************************************************************

巧填奇数阶幻方(魔方阵)[转]2007-01-03 17:57 一、什么叫幻方?

(通俗点说)把一些有规律的数填在纵横格数都相等的正方形图内,使每一行、每一列和每一条对角线上各个数之和都相等。这样的方阵图叫做幻方。

幻方又分为奇数阶幻方和偶数阶幻方。链芹奇数阶幻方是指横行、竖列都是单数(即3、5、7、9……)的方阵图。偶数阶幻方是指横行、竖列都是双数(即4、6、8、10……)的方阵图。

二、奇数阶幻方的填法。

奇数阶幻方中最简便的一种就是三阶幻方,又称“九宫图”。

平常我们遇到这类题都是用分析、分组、尝试的方法推出,这种方法较麻烦,如果是五阶幻方、七阶幻方就更困难了。

有一种方法不仅能很快地填出三阶幻方,还能很快地填出五阶幻方、七阶幻方、九阶幻方……那就是“口诀法”

口 诀

“1”坐边中间,斜着把数填;

出边填对面,遇数往下旋;

出角仅棚逗毕一次,转回下格间。

注意:

(1)这里的“1”,是指要填的这一列数中的第一个数。

(2)“1”坐边中间,指第一个数要填在任何一边的正中间的空格里。

(3)从1到2时,必须先向边外斜(比如:第一个数填在上边的正中间,填第二个数时,要向左上方或右上方斜),填后面的数时也要按照同样的方向斜。

*******************************************************************************************************************************/

#include<iostream>

using namespace std

void main()

{

int a[32][32],i,j,k,p,n

p=1

while(p==1)

{

cout<<"Enter n(n=1~25):"

cin>>n

if((n!=0)&&(n<=25)&&(n%2!=0))

p=0

}

for(i=1i<=ni++)

for(j=1j<=nj++)

a[i][j]=0

j=n/2+1

a[1][j]=1

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

{

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=1i<=ni++)

{

for(j=1j<=nj++)

cout<<a[i][j]<<" "

cout<<endl

}

}

/*C_ban*

所谓的魔方距阵就是一种特殊的奇数阶方阵:它的行,列,对角线,上的数字之和都要相等,且方阵中的每一个数字都不相等,且数字的范围都在1到n*n之间.

我编的程序如下:

*/

#include<stdio.h>

#define N 15

main()

{

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

clrscr()

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=0i<sizei++)

for(j=0j<sizej++)

square[i][j]=0

i=0j=(size-1)/2

square[i][j]=1

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

{

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=0i<sizei++)

{

for(j=0j<sizej++)

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

printf("\n")

}

}

只能求奇数的魔方阵

#define N 20

main()

{

int a[N][N]

int n,i,j,r

scanf("%d",&n)

for(i=0i<Ni++) for(j=0j<Nj++) a[i][j]=0

i=0

j=n/2

a[i][j]=1

for (r=2r<=n*nr++)

if (a[(i+n-1)%n][(j+1)%n]==0)

{i=(i+n-1)%nj=(j+1)%na[i][j]=r}

else

{i=(i+1)%na[i][j]=r}

for(i=0i<ni++)

{

for(j=0j<nj++) printf("%4d",a[i][j])

printf("\n")

}

}

这是以前别人写的,你参考一下!


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

原文地址: http://outofmemory.cn/yw/12526890.html

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

发表评论

登录后才能评论

评论列表(0条)

保存