用递归求汉诺塔,
汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这n个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B、C座,要求打印移动的步骤(前100步)和共需步数。
若n>100,输出前100步。
若n<=100,输出所有步。
最后一行输出n。
每一步的格式:a b c d,a为步序数,b为移动的盘子序号,c d表示从c移到d。
5
1 1 A C 2 2 A B 3 1 C B 4 3 A C 5 1 B A 6 2 B C 7 1 A C 8 4 A B 9 1 C B 10 2 C A 11 1 B A 12 3 C B 13 1 A C 14 2 A B 15 1 C B 16 5 A C 17 1 B A 18 2 B C 19 1 A C 20 3 B A 21 1 C B 22 2 C A 23 1 B A 24 4 B C 25 1 A C 26 2 A B 27 1 C B 28 3 A C 29 1 B A 30 2 B C 31 1 A C 31
步数step可以定义在main()函数之外,在hanoi()函数内修改step。
不要忘记最后换行\n!
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int i=0,k; //用k保留n的原始值,以便在函数中用到
void func(int n,char A,char B,char C); 求汉诺塔的函数
int main()
{
int n;
scanf("%d",&n);
k=n;
func(n,'A','B','C');
k=pow(2,n)-1;
printf("%d\n",k);
return 0;
}
void func(int n,char A,char B,char C)
{
if(i>=100)
{
int l=pow(2,k)-1; //2的k次方减一
printf("%d\n",l);
exit(1); //stdlib.h中的,相当于return0;
}
if(n==1) //如果只有一个盘子,就是从A->C
{
i++;
printf("%d %d %c %c\n",i,n,A,C);
}
else
{
func(n-1,A,C,B); //将n-1个盘子从A经过C移动到B,
i++;
printf("%d %d %c %c\n",i,n,A,C);//将第n个盘子从A经过移动到C;
func(n-1,B,A,C); //现在n-1个盘子就是原来n个盘子的子问题,就可以用递归求解
}
}