算法篇【递归1 -- 汉诺塔问题】

问题:A,B,C 三个塔座,A上有64个盘子,盘子大小不等,大的在下,小的在上,现在想要把64个盘子从A座上移动到C座,但是每次只能移动一个盘子,且每个塔座上始终要保持大盘在下,小盘在上,求出移动步骤。

输入:

         第一行是一个正整数,表示有多少个盘子

输出:

         每一次是如何移动盘子的,

思路:

         刚开始的时候,首先需要将N个盘子的前N-1个移动到中转塔上,然后将第N个盘子从src塔上移动到dst塔上,将前N-1个移动到中转塔上的问题,就是分解后N-1个盘子的Hanoi塔问题。然后对N-1个盘子的Hanoi塔问题再进行求解。

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void Hanoi(int n, char src, char mid, char dst){
 5     //将src上的n个盘子,以mid为中转,移动到dst上。 
 6     if(n==1){
 7         //只需要移动一个盘子时,直接将盘子从src移动到dst即可。 
 8         cout << src << "-->" << dst << endl;
 9         return; 
10     }
11     //先将n-1个盘子从src移动到dst。 
12      Hanoi(n-1, src, dst, mid);
13      //再将一个盘子从src移动到dst。 
14      cout << src << "-->" << dst << endl;
15      //递归算法,最后将n-1个盘子从mid移动到dst。 
16      Hanoi(n-1, mid, src, dst);
17      return;
18 }
19  
20 int main()
21 {
22     int n ;
23     cin >> n ;
24     Hanoi(n, 'A', 'B', 'C') ;
25     return 0;
26     system("pause");
27 }

 

 

posted on 2018-03-12 00:04  hematologist  阅读(239)  评论(0编辑  收藏  举报

导航