汉诺塔问题
问题
已知有三根柱子,在一根柱子上从下往上按照大小顺序摞着n片圆盘。把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
解决思路
把n个盘子看成最下面的一层和上面n-1层,n-1层移动到辅助柱子,最下面的盘子放在目标柱子,再以源柱子为辅助
过程
1.把n-1个盘子从源柱子移动到辅助柱子,以目的柱子为辅助
2.把第n个盘子从源柱子移到目标柱子
3.把n-1个盘子从辅助柱子移动到目标柱子,以源柱子为辅助
代码
#include<stdio.h>
#define N 5
void Hanoii(int n,char s,char a,char t);
// 盘子数目 源柱子 辅助柱子 目标柱子
void Hanoii(int n,char s,char a,char t){
static int count;
if(n > 0){
Hanoii(n-1,s,t,a);//把n-1个盘子从源柱子移动到辅助柱子,以目的柱子为辅助
printf("(%03d)%d:%c => %c\n",++count,n,s,t);//把第n个盘子从源柱子移到目标柱子
Hanoii(n-1,a,s,t);//3.把n-1个盘子从辅助柱子移动到目的柱子,以源柱子为辅助
}
}
void main(void){
Hanoii(N,'A','B','C');
}