算法篇【递归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 }
本文来自博客园,作者:hematologist,转载请注明原文链接:https://www.cnblogs.com/littleMa/p/8547100.html
posted on 2018-03-12 00:04 hematologist 阅读(242) 评论(0) 编辑 收藏 举报