基于C语言的 汉诺塔问题的实现。
汉诺塔问题简介
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上
问题解决方案
最常见的就是使用递归的方法求解汉诺塔问题
我的理解是 将汉诺塔问题移动步骤简化
首先我们考虑二层汉诺塔问题的解决方法:
上图是二层汉诺塔问题的初始状态(图画的有点丑意思应该能表达出来
)
这是第一步 将1号块移到b上去
第二步 将2号块转移到c上
最后将第一块移到目的地c上去
所以上述可以简单的表示为
1号从a——>b
2号从a——>c
1号从b——>c
我们可以对这个过程做一个简单的推广:
当层数为三层的汉诺塔问题的时候 我们可以将第一块和第二块打包 类似下图:
这样我们就回归到求二层汉诺塔的模型中
当我们将其推广到n层汉诺塔的时候 我们已经不难看出这是一个递推的问题了
于是求解n层汉诺塔的问题就能大概看成这样“三个”步骤:
1:将前n-1层移到b
2:将第n层移到c(目的地)
3:将(已经位于b的)n-1层 移动到c
代码的实现 (C)
//大致是这样的 分为三步 类似于打包分割的思想
//1、将n-1个移到b
//2、将第n个移到c
//3、将n-1个移到c
void Hanoi(int n,char a,char b,char c)
{
if (n == 1)
{
printf("将第%d块从%c——>%c\n", n, a, c);
}
else
{
Hanoi(n - 1, a, c, b); //步骤一
printf("将第%d块从%c——>%c\n", n, a, c); //步骤二
Hanoi(n-1,b,a,c); //步骤三
}
}
int main()
{
int n=3;
printf("请输入汉诺塔层数:");
scanf("%d",&n);
printf("\n汉诺塔移动步骤:\n");
Hanoi(n,'a','b','c');
return 0;
}
(本人新手刚刚上路 有不足之处请各位大佬多多指教。)