问题描述:
n阶Hanoi塔问题,假设有3个分别命名为A、B、C塔座,在塔座A上插有n个直径大小各不相同、依小到大的圆盘。现要求将A轴上的n个圆盘移动至塔座C上并按同样顺序叠排,圆盘移动时必须遵循下列规则:
(1)每次只能移动一个圆盘;
(2)圆盘可以插在A、B、C的任意一个塔座上;
(3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
算法求解:
n = 1,则直接从 A 移到 C。否则 :
(1)用 C 柱做过渡,将 A 的(n-1)个移到 B
(2)将 A 最后一个直接移到 C
(3)用 A 做过渡,将 B 的 (n-1) 个移到 C
cpp
#include <stdio.h>
int m=0;
void Move(int n,char A,char B,char C)
{
m++;
//设置移动盘子的结束条件,如果A当前还有一个盘子那么就把他直接移动到C
if(n == 1) {
printf("%c -> %c\n",A,C);
}else{
//否则开始递归
Move(n-1,A,C,B);//递归, 将A上编号为1至n-l的圆盘移到B, C做辅助塔;
//直接将编号为n的圆盘从A移到C;
printf("%c -> %c\n",A,C);
Move(n-1,B,A,C);//递归, 将B上编号为1至n-1的圆盘移到C, A做辅助塔
}
}
int main()
{
int n;
printf("请输入盘子数:");
scanf("%d",&n);
//如果有五个盘子,和A,B,C三个柱子,否则开始递归.
Move(n,'A','B','C');
printf("移动次数:%d次",m);
}