汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则:
每次只能移动柱子最顶端的一个圆盘;
每个柱子上,小圆盘永远要位于大圆盘之上;
汉诺塔问题中,3 个圆盘至少需要移动 7 次,移动 n 的圆盘至少需要操作 2n-1 次。
对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:
将起始柱上的 n-1 个圆盘移动到辅助柱上;
将起始柱上遗留的 1 个圆盘移动到目标柱上;
将辅助柱上的所有圆盘移动到目标柱上。
由此,n 个圆盘的汉诺塔问题就简化成了 n-1 个圆盘的汉诺塔问题。按照同样的思路,n-1 个圆盘的汉诺塔问题还可以继续简化,直至简化为移动 3 个甚至更少圆盘的汉诺塔问题。
void move(char pos1, char pos2)
{
printf(" %c->%c ", pos1, pos2);
}
//n:代表盘子的个数
//pos1:起始位置,表示起始柱
//pos2:中转位置,表示辅助柱
//pos3:目的位置,表示目标柱
void Hanoi(int n, char pos1, char pos2, char pos3)
{
if (n == 1)// 如果圆盘数量仅有 1 个,则直接从起始柱移动到目标柱
{
move(pos1, pos3);
}
else
{
//递归调用 hanoi 函数,将 n-1 个圆盘从起始柱移动到辅助柱上,整个过程的实现可以借助目标柱
Hanoi(n - 1, pos1, pos3, pos2);
// 将起始柱上剩余的最后一个大圆盘移动到目标柱上
move(pos1, pos3);
// 递归调用 hanoi 函数,将辅助柱上的 n-1 圆盘移动到目标柱上,整个过程的实现可以借助起始柱
Hanoi(n - 1, pos2, pos1, pos3);
}
}
#include<stdio.h>
void move(char pos1, char pos2)
{
printf(" %c->%c ", pos1, pos2);
}
//n:代表盘子的个数
//pos1:起始位置
//pos2:中转位置
//pos3:目的位置
void Hanoi(int n, char pos1, char pos2, char pos3)
{
if (n == 1)
{
move(pos1, pos3);
}
else
{
Hanoi(n - 1, pos1, pos3, pos2);
move(pos1, pos3);
Hanoi(n - 1, pos2, pos1, pos3);
}
}
int main()
{
char pos1 = 'a';
char pos2 = 'b';
char pos3 = 'c';
int n;
scanf("%d", &n);
Hanoi(n, pos1,pos2, pos3);
}