汉诺塔问题据说源自一个印度的古老传说,本人觉得真的很无聊,古代印度人是有多无聊才能想到这个玩法。。。
汉诺塔可以利用递归的思想去解决,在解决这个问题的时候,可以先从两个盘子开始模拟,进而推到三个盘子以致更多。
具体代码如下:
//目标:将a柱的盘子移动到c柱
#include <stdio.h>
#include <stdlib.h>
void Hanoi(int i, char a, char b, char c);//将a柱的盘子通过b移动到c柱
void Move(int i, char a, char b);//移动操作
int count; //统计总共移动的次数
int main()
{
int n;
while (scanf_s("%d", &n) != EOF)
{
count = 0;
Hanoi(n, 'A', 'B', 'C');
}
}
void Hanoi(int i, char a, char b, char c)
{
if (i == 1)
Move(i, a, c);
else
{
Hanoi(i - 1, a, c, b);
Move(i, a, c);
Hanoi(i- 1, b, a, c);
}
}
void Move(int i, char a, char b)
{
count++;
printf("第%d次 move %d from %c to %c\n",count, i, a, b);
}
注释: 这段代码不仅交代了解决的步骤,还对操作的次数进行了统计,最后可以得到总的移动次数,建议大家试一试,看看最后得出的总移动次数有什么规律?(2^n-1)
如果对这个过程有理解不清的地方可以看看这个视频: