把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
操作规则:
每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
思路:
图解:
示例:
当有两个盘a,b时
示例:
当有三个盘a,b,c时
算法分析(递归算法):
实现这个算法可以简单分为三个步骤:
(1) 把n-1个盘子由A 移到 B;
(2) 把第n个盘子由 A移到 C;
(3) 把n-1个盘子由B 移到 C;
从这里入手,在加上上面数学问题解法的分析,我们不难发现,移到的步数必定为奇数步:
(1)中间的一步是把最大的一个盘子由A移到C上去;
(2)中间一步之上可以看成把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,
(3)中间一步之下可以看成把B上n-1个盘子通过借助辅助塔(A塔)移到了C上
递归的代码实现
```#include
void hanoi(int n, char source, char goal, char temp)
{
if (n == 1)
{
printf("Move %d :from %c to %c\n", n, source, goal); //将第n个盘子从source移动到goal
}
else
{
hanoi(n - 1, source, goal, temp);
//将n-1个盘子借助goal从source移动到temp
printf("Move %d :from %c to %c\n", n, source, goal);
//将第n个盘子从source移动到goal
hanoi(n - 1, temp, goal, source);
//将n-1个盘子借助source从temp移动到goal
}
}
int main()
{
int n = 0;
printf("请输入盘子的个数:");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');//借助B杆将A中盘移动到C上
return 0;
}```