TEST #3. (Hardness: Easy)
Figure 3 Hanoi Tower
可能大家都学过Hanoi Tower。Hanoi Tower originated from an Indian story,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘。有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。恩,当然这个传说并不可信,如今汉诺塔更多的是作为一个玩具存在。Gardon就收到了一个汉诺塔玩具作为生日礼物。Handsome想了一个新的规定,如果所有移动一定是顺时针方向,也就是说,从A到B,或从B到另一个杆,或从另一个杆到A.现在Handsome想知道一次游戏种使用N个盘子时,他最少需要多少次移动才能把他们从A转移到B.很显然,在没有限定只能顺时针时,问题的解是2^N-1,但现在有这个要求,又该是多少呢?
Input
包含多组数据,每个数据一行,是盘子的数目N(1<=N<=40)。
Output
对于每组数据,输出一个数,到达目标需要的最少的移动数。
Sample Input
1
5
Sample Output
1
119
Hint: 递归的思想
/*******************************************
*项目:算法实验二 TEST #3
*姓名:卿**
*学号:SA14226***
*******************************************/
//本题其实完全可以用mov操作解决...由于审题失误...以为是A-C的问题
//所以写出了一个汉诺塔问题的函数
#include "stdio.h"
void mov(int n,char x,char y);
void hanorta(int n,char A,char B,char C);
long step;
/*函数: hanorta
输入:阶数n,问题方向
功能:解决n阶汉诺塔问题,从A经过B到C的问题
*/
void hanorta(int n,char A,char B,char C){
if(n == 1){
mov(1,A,B);
mov(1,B,C);
}
else{
hanorta(n-1,A,B,C);
//printf("move %d from %c to %c\n",n,A,B);
step++;
mov(n-1,C,A);
//printf("move %d from %c to %c\n",n,B,C);
step++;
hanorta(n-1,A,B,C);
}
}
/*函数: mov
输入:阶数n,问题方向
功能:解决n次x->y问题
*/
void mov(int n,char x,char y){
if(n == 1){
//printf("move %d from %c to %c\n",n,x,y);
step++;
}
else{//只有三种允许情况
if(x == 'A'&& y == 'B'){ //A->B
hanorta(n-1,'A','B','C');
//printf("move %d from %c to %c\n", n,x,y);
step++;
hanorta(n-1,'C','A','B');
}
else if(x == 'B' && y =='C'){ //B->C
hanorta(n-1,'B','C','A');
//printf("move %d from %c to %c\n", n,x,y);
step++;
hanorta(n-1,'A','B','C');
}
else if(x == 'C' && y =='A'){ //C->A
hanorta(n-1,'C','A','B');
//printf("move %d from %c to %c\n", n,x,y);
step++;
hanorta(n-1,'B','C','A');
}
else
printf("ERROR");
}
}
int main()
{
int n;
while(scanf("%d",&n) != EOF){
step = 0;
mov(n,'A','B');
printf("%d\n",step);
}
return 0;
}