分析:
当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。
当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,
再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。
当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),
然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。
当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),
然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。
第一个参数n:代表盘子的个数,也为盘子编号
第二个参数a:代表源杆
第三个参数b:代表中间杆
第四个参数c:代表目标杆
#include <stdio.h>
void Hanoi(int n, char a,char b,char c);
void Move(int n, char a, char c);
int count;
void main()
{
int n=4;//个数
Hanoi(n, 'A', 'B', 'C');
}
void Hanoi(int n, char a, char b, char c)
{
if (n == 1)//当盘子的个数为1,直接将源杆上的盘子移动至目标杆
{
Move(n, a, c);
}
else
{
Hanoi(n - 1, a, c, b);//a为初始塔,将n-1个盘子借助c移动到b上
Move(n, a, c);//将剩下的一个盘子n,直接从初始塔a移动到目标塔c上
Hanoi(n - 1, b, a, c);//此时将b看作初始塔,b借助a移动到c
}
}
void Move(int n, char a, char c)//第一个参数n:代表要移动的盘子,第二参数a:源杆,第三个参数c:目标杆
{
count++;//记录所移动步数
printf("第%d次移动 Move %d: Move from %c to %c !\n",count,n,a,c);
}