递归分治思想--汉诺塔问题

汉诺塔

这其实也是一个经典的递归问题

 

我们可以做这样的考虑:

先将前63个盘子移动到Y上,确保大盘在小盘下。

再将最底下的第64个盘子移动到Z上。

最后将Y上的63个盘子移动到Z上。

 

这样子看上去问题就简单一点了,但是关键在于第1步和第3步应该如何执行呢?

在游戏中,我们发现由于每次只能移动一个圆盘,所以在移动的过程中显然要借助另外一根针才行。

也就是说第1步将1~63个盘子借助Z移到Y上,第3步将Y针上的63个盘子借助X移到Z针上。那么我们把所有新的思路聚集为以下两个问题:

问题一:将X上的63个盘子借助Z移到Y上;

问题二:将Y上的63个盘子借助X移到Z上。

 

解决上述两个问题依然用相同的方法:

 

问题一的圆盘移动步骤为:

先将前62个盘子移动到Z上,确保大盘在小盘下。

再将最底下的第63个盘子移动到Y上。

最后将Z上的62个盘子移动到Y上。

 

问题二的圆盘移动步骤为:

先将前62个盘子移动到X上,确保大盘在小盘下。

再将最底下的第63个盘子移动到Z上。

最后将X上的62个盘子移动到Y上。

 

。。。。。

代码:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 
 6 //将n个盘子从x借助y移动到z
 7 void mymove(int n,char x,char y, char z)
 8 {
 9     if (n == 1)
10         cout<<x<<"-->"<<z<<endl;
11     else
12     {
13         mymove(n-1,x,z,y); //将X上的n-1个盘子借助Z移到Y上;
14         cout<<x<<"-->"<<z<<endl; //将X上的第n个盘子移动到z上;
15         mymove(n-1,y,x,z); //将Y上的n-1个盘子借助X移到Z上。
16     }
17 }
18 
19 int main()
20 {
21     int n;
22     cin>>n;
23     mymove(n,'x','y','z');
24     return 0;
25 }

输出:

 

posted @ 2017-08-14 15:26  ren_zhg1992  阅读(153)  评论(0)    收藏  举报