汉诺塔问题是一个经典问题,是一道练习递归的好题目。
题意:有a,b,c三个柱子,其中a中套有n个盘,下面的盘总是比上面的盘大。(为了方便称呼,我们记第 i 的盘子的编号为 i )在移动过程中,每次只能移动一个盘,且这个盘必须小于所放的位置下面的盘。试求出一个方案,描述出将这n个盘从a柱移动到b柱的方案。
思考一下,也许n层的汉诺塔不好解决,但是能不能通过n-1层的汉诺塔来得到n层的呢?
答案似乎是可以的。
如图。第一步,将上面n-1层盘移动到c柱(在此过程中不会有问题,因为第n层盘最大,任何盘都可以放到它上面);第二步,将第n个盘移动到b柱(o(1));第三步,将原来的n-1层盘移到b柱。
好了?
好了。
这是一个递归:
1.基础情况:当n=1时,不假思索,直接移动。
2.单位操作:O(1)输出从第n个盘从a柱到b柱。
好了,完成了。
#include<stdio.h>
#include<iostream>
int n;
char a,b,c;
void H(int now,char from,char help,char to){
if(now==1){//当层数为1时,直接输出
printf("%c->1->%c\n",from,to);
return;
}
H(now-1,from,to,help);//调用n-1(相信它一定能行)
printf("%c->%d->%c\n",from,now,to);//单位问题,O(1)解决
H(now-1,help,from,to);//再调用n-1
}
signed main(){
scanf("%d %c %c %c",&n,&a,&b,&c);//n个盘,a,b,c三个盘的名字
H(n,a,c,b);//调用n层的汉诺塔
}
完结撒花。