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