七块汉诺塔完成所需步骤如下:用1到7表示七个汉诺塔圆盘,圆盘半径默认为1<2<3<4<5<6<7;以ABC表示汉诺塔的三个柱子,A为最左,B为中间,C为最右;
1—C表示把1号圆盘移动到第三个柱子上,以此类推:
一、1—C;2—B;1—B;3—C;1—A;2—C;1—C;4—B;1—B;2—A;
二、1—A;3—B;1—C;2—B;1—C;5—C;1—A;2—C;1—C;3—A;
三、1—B;2—A;1—A;4—C;1—C;2—B;1—B;3—C;1—A;2—C;
四、1—C;6—B;1—B;2—A;1—A;3—B;1—C;2—B;1—B;4—A;
五、1—A;2—C;1—C;3—A;1—B;2—A;1—A;5—C;1—C;2—B;
六、1—B;3—C;1—A;2—C;1—C;4—B;1—B;2—A;1—A;3—B;
七、1—C;2—B;1—B;7—C;1—A;2—C;1—C;3—A;1—B;2—A;
八、1—A;4—C;1—C;2—B;1—B;3—C;1—A;2—C;1—C;5—A;
九、1—B;2—A;1—A;3—B;1—C;2—B;1—B;4—A;1—A;2—C;
十、1—C;3—A;1—B;2—A;1—A;6—C;1—C;2—B;1—B;3—C;
十一、1—A;2—C;1—C;4—B;1—B;2—A;1—A;3—B;1—C;2—B;
十二、1—B;5—C;1—A;2—C;1—C;3—A;1—B;2—A;1—A;4—C;
十三、1—C;2—B;1—B;3—C;1—A;2—C;1—C;
扩展资料:
汉诺塔的算法介绍
其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步 *** 作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;
若n为奇数,按顺时针方向依次摆放 A C B。
⑴按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。
⑵接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较大的圆盘。
这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。
⑶反复进行⑴⑵ *** 作,最后就能按规定完成汉诺塔的移动。
所以结果非常简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
扩展资料来源:百度百科-汉诺塔-算法介绍
这是用递归来实现的
要把n个从A通过B移到C,就先要把上面n-1个从A通过C移到B1,然后把第n个移到C。在把n-1个从B通过A移动到C。
那么首先要解决1,也是用同样的方法,只是把B和C交换位置而已。
就这样递归实现
这个要求逻辑思维比较高,也不太容易说清楚,你好好想想把。我能做的只有这么多了
VB编写益智游戏“汉诺塔”
海粟/文
《软件报》2007年47期 61-74
编程引子
“汉诺塔”问题源自印度的一个古老传说,对于它的算法比较常见的是应用递归调用。在本例中,笔者将给大家介绍一种更简单和直观的处理方法。
编程分析
汉诺塔游戏的主要目的是借助B区域,将A区域的五只盘子转移到C区域中,要求每次移动必须从最上层盘子开始,而且必须始终保证小号盘子在大号盘子的上方。
程序的主要技术点,除了对上述要求的实现外,还要考虑到鼠标拖放盘子以及盘子的定位、排序等内容。在设计初期,笔者首先考虑采用单击选定,再次单击定位的方式来移动盘子,但这样做必须要让程序记住谁是活动盘子,而且 *** 作的直观性较差。所以,最后笔者还是选择了利用鼠标事件来模拟拖动盘子的动作。
而对于盘子移动后的定位问题,如果单纯靠坐标计算来显然,工作量是非常大的。所以,笔者在本例中应用了“一个萝卜一个坑”的简单原理,将目标位置提前放置好Image控件,这样一来,盘子的移动和定位 *** 作都成了对目标控件属性的控制,处理起来变得十分方便。
主要代码
1.程序初始化
程序初始化 *** 作在窗体加载事件中完成,另外它与“重新开始”功能模块的作用完全相同,所以可以通过调用的方式来共享代码。代码的主要功能是移动步骤清零、在A区域复位盘子,以及清除B和C两区域盘子等,主要内容如下:
Private Sub Command1_Click()
Label4Caption = 0 ’移动步骤清零
For i = 0 To 4
Image1(i)Picture = LoadPicture(AppPath & "\p" & i & "jpg")
Image2(i)Picture = LoadPicture("")
Image3(i)Picture = LoadPicture("")
Next i
Call SortImg(Image1, 1080) ’对齐盘子
End Sub
其中子过程SortImg是对指定区域内盘子进行居中对齐 *** 作,后文中会有详细介绍。
2.转移盘子
该过程是整个程序的核心,需要考虑的事件包括从A区至B区和C区、从B区至A区和C区、从C区至A区和B区这样共六种情况,为了简化代码编写,笔者在程序中使用了控件数组。下面是从A区向其它两区转移盘子的代码,其它几种情况与之类似:
Private Sub Image1_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
If Index < 4 Then If Image1(Index + 1)Picture <> 0 Then Exit Sub ’移动 *** 作不合法
If X >= 2000 And X <= 3200 Then
Call MoveImg(Image1, Image2, Index) ’从A向B转移
Call SortImg(Image2, 3420) ’对齐盘子3420为区域中心线X值
End If
If X >= 4300 And X <= 5700 Then
Call MoveImg(Image1, Image3, Index) ’从A向C转移
Call SortImg(Image3, 5760)
End If
End Sub
通过分析可知,如果用户所选盘子的上方还有盘子,则不符合游戏规则,会被终止。另外,程序中使用了类似其它软件中的“热区域”的概念,即当拖动鼠标至我们规定的B区域中时,将引发真正的移动 *** 作(即激活子过程MoveImg),其主要代码如下:
Private Sub MoveImg(SImg As Object, DImg As Object, Idx As Integer)
For i = 0 To 4
If DImg(i)Picture = 0 Then ’当前区域有位置
If i > 0 Then
If SImg(Idx)Width < DImg(i - 1)Width Then ’符合上小下大游戏条件
DImg(i)Picture = SImg(Idx)Picture ’移动盘子
Exit For
Else
Exit Sub ’移动 *** 作不合法则退出
End If
Else
DImg(i)Picture = SImg(Idx)Picture ’向区域最下方移动盘子
Exit For
End If
End If
Next i
If i <= 4 Then
SImg(Idx)Picture = LoadPicture("")
Label4Caption = Label4Caption + 1 ’更新 *** 作步数
End If
End Sub
在移动子过程中,判定位置是否为空的主要依据是目标Image控件的Picture属性是否为0;当获知位置可用时,再进一步判断当前位置的下面位置盘子的尺寸是否大于当前盘子(即对游戏规则的判定),条件满足的话就可以通过传递Picture属性值来完成移动 *** 作了;最后,还要将源位置盘子清空,并且记录 *** 作步数。
3.对齐盘子
在上述两模块中都涉及了子过程SortImg,其主要功能是对区域内盘子进行居中对齐处理,这是美化程序执行效果的一项重要措施,同时在该部分中还加入了游戏胜利过关的判断(即每转移一步判断一次),主要代码如下:
Private Sub SortImg(Img As Object, IntCenter As Integer)
For i = 0 To 4
Img(i)Left = IntCenter - Img(i)Width / 2
Next i
For i = 0 To 4
If Image1(i)Picture <> 0 Then Exit For
If Image2(i)Picture <> 0 Then Exit For
Next i
If i > 4 Then MsgBox "恭喜:你成功了!", vbOKOnly + vbInformation, "胜利"
End Sub
编程后记
面对一些看似复杂的程序功能,仔细研究一下,总会有好的思路和方法闪现出来。本例实现了汉诺塔游戏的基本设计思路,大家还可以在盘子数量、步数排行榜等方面予以改进,以使该程序变得更加丰富、精彩!
我跟你说说吧!
#include <stdioh>
#include <stringh>
#define OUT 0
#define IN 1
void
move( int n, int x, int y, int z )
{
if ( n == 1 )
printf ( "%d-->%d\n", x, z );
else
{
move( n - 1, x, z, y );
printf( "%d-->%d\n", x, z );
move( n - 1, y, x, z );
}
}
int
main( int argc ,char argv[] )
{
int h;
printf( "Input how many hanio there are:" );
scanf( "%d", &h );
printf( "The result is :\n" );
move( h, 1, 2, 3 );
getchar();
return ( 0 );
}
其中子函数的x,y,z表示三个底座。自己看看哦,很简单的
以上就是关于求七块汉诺塔完成所需步骤(不要编程,只要步骤全部的内容,包括:求七块汉诺塔完成所需步骤(不要编程,只要步骤、C++编程 汉诺塔 这个程序请详细解释一下它的设计思想、汉诺塔VB的心得体会等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)