/*汉诺塔算法
解法如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。
如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,
也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,其实就是进入程式的递回处理。
事实上,若有n个盘子,则移动完毕所需之次数为2^n - 1
*/
#include <stdio.h>
//可以把A,B,C依次当成源,辅助,目的
void hanoi(int n, char A, char B, char C)
{
if(n == 1) //只有一个盘子时,就将它从“源”直接搬至“目的”
{
printf("Move sheet %d from %c to %c\n", n, A, C);
}
//如果盘数超过2个(n>2),处理上边的n-1个盘子,以A为源,C为辅助,B为目的
//上边的n-1个处理完,B上有n-1个盘子,A上有一个,
//处理最下边的第n个,将A上的最后一个移动到C上,再以B为源,C为目的,A为辅助移动
//B上的n-1个盘子
else
{
hanoi(n-1, A, C, B);
printf("Move sheet %d from %c to %c\n", n, A, C);
hanoi(n-1, B, A, C);
}
}
int main(void)
{
int n;
printf("请输入盘数:");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}