问题描述
古代有一个梵塔,塔内有3个基座分别为A,B,C,开始时A基座上有64个盘子,盘子大小不等,大的在下面,小的在上面(如下图所示)。有一个老和尚想把这64个盘子从A基座移动到C基座,但每次只允许移动一个盘子,且在移动过程中,3个基座上的盘子都始终保持大盘在下面,小盘在上。在移动过程中可以利用B基座做辅助。请编程打印出移动方案。
算法设计
代码编写
/*************************
*
*第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔
*
*/
#include <stdio.h>
char x='A',y='B',z='C';//ABC三个基座
int n;//盘子的个数
int step=1;//记录步数,表示目前正在移动盘子的是第几步
void init();
void move(int n,char from,char to);
void hanoi(int n,char from,char denpend_on,char to) ;
void init(){
printf("请输入A基座盘子的个数:\n");
scanf("%d",&n);
printf("盘子移动情况如下:\n");
}
/****************
*移动函数,表示把第n个盘子从某一个座from移动到另外一个座to
****************/
void move(int n,char from,char to) {
printf("第 %d 步:将 %d 号盘子从 %c 移动到 %c \n",step++,n,from,to);
}
/**************
*将n个盘子由初始塔移动到目标塔(利用借用塔)
***************/
void hanoi(int n,char from,char denpend_on,char to) {
if (n==1)
move(n,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地
else {
hanoi(n-1,from,to,denpend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
move(n,from,to); //将剩下的一个盘子移动到目的塔上
hanoi(n-1,denpend_on,from,to);//最后将借用塔上的n-1个盘子移动到目的塔上
}
}
int main() {
init();
hanoi(n,x,y,z);
return 0;
}
打印结果