汉诺塔介绍
汉诺塔(Tower of Hanoi),源于印度古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
嗯?!!一次只能移动一个盘子?这该怎么办
分析
核心思想
将盘子分为两部分,一部分为1-倒数第二个盘子,另一部分为最后一个盘子
假设有三个柱子,分别为a,b,c。
(1)找一个人能将63个盘子移动到b柱,剩下最底下一个盘子
(2)自己将最底下这个盘子移到c柱
(2)找这个人再将剩下的63个盘子从b移到c柱
这样就形成了第一次操作(即第一层递归)
接下来我们就要想办法搞明白将63个盘子”移动到b柱” “从b移到c“是如何操作的。
要想移动到b柱,则需借助c。将前62个盘子先移到c,再将第63个移到b,再将前62个移到b。(发现没有,这里又是3个步骤)
这样,又形成了一次递归
现在,我们是不是有了一点思路呢?
开始写代码
接下来我们开始写代码主函数:
int main()
{
int n;//盘子个数
scanf("%d", &n);
hanoi(n,'A','B','C');
return 0;
}
先将基本需求写出,我们需要自定义函数hanoi( )
void hanoi(int n, char a, char b, char c)
{
if (n == 1) //限制条件
{
printf("%c -> %c\n", a, c);
}
else
{
//越来越接近限制条件 - (n-1)
hanoi(n - 1, a, c, b);//a借助c移动到b
printf("%c -> %c\n", a, c); //直接操作
hanoi(n - 1, b, a, c);//b借助a移动到c
}
}
好了,现在我们就可以解决这一问题了。
总代码
#include<stdio.h>
void hanoi(int n, char a, char b, char c)
{
if (n == 1) //限制条件
{
printf("%c -> %c\n", a, c);
}
else
{
//越来越接近限制条件 - (n-1)
hanoi(n - 1, a, c, b);//a借助c移动到b
printf("%c -> %c\n", a, c); //直接操作
hanoi(n - 1, b, a, c);//b借助a移动到c
}
}
int main()
{
int n;
scanf("%d", &n);
hanoi(n,'A','B','C');
return 0;
}