汉诺塔问题
基本思路
不要试图用脑子跟踪递归的每一步,就是应为脑子跟不过来才用的递归思想
将N 个盘子从A 座移到C 座可以分解为以下三个步骤:
- 将A 上N-1 个盘借助C 座县移到B 座上;
- 把A 座上剩下的一个盘移到C 座上;
- 将N-1 个盘从B 座借助于A 座移到C 座上。
上面第1步与第3步的操作相似,因此可以将上面3个步骤分为两类操作
- 将N-1 个盘子从一个座移到另一个座(N>1 )。
- 将1 个盘子从一个座移到另一个座上。
代码如下
#include <stdio.h>
void move(char x,char y)//move函数
{
printf("%c--->%c\n",x,y);
}//move
void hanoi(int n,char one,char two, char three)//hanoi函数
{//将n个盘借从one座借助two座,移到three座
if(n==1) move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}//hanoi
int main()
{
int n;
scanf("%d",&n);
hanoi(n,'A','B','C');
return 0;
}//main