汉诺塔问题(c++实现)
2018-03-22 20:11
411 查看
问题描述:有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置n个金盘。目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
分析:要经过以下几步:
(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;
(2)将A杆中剩下的第n号盘移至C杆;
(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。
代码:
理解:刚才步骤中的1和3。最主要的差别是从ACB变为BAC。因为B在这里充当了之前A的角色,A充当了之前C的角色,C充当了之前B的角色(辅助柱子是不一样的)。然后其实这是一个递归(分治)问题,递归问题主要是要找到n和n-1之间的联系。当n-1和n的操作类似时,就可以使用递归(逆推的思想)。
分析:要经过以下几步:
(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;
(2)将A杆中剩下的第n号盘移至C杆;
(3)以A杆为中介;从B杆将1至n-1号盘移至C杆。
代码:
#include <iostream> using namespace std; void hanoi(int n, char A, char B, char C) { if (n == 1) { cout << A << "->" << C << endl; return;//递归终止 } hanoi(n - 1, A, C, B);//将n-1个盘子从A移到B cout << A << "->" << C << endl; hanoi(n - 1, B, A, C);//将n-1个盘子从B移到C return; } void main() { char A = 'A', B = 'B', C = 'C'; int n; cout << "请输入圆盘数量:"; cin >> n; hanoi(n, A, B, C); system("pause"); }
理解:刚才步骤中的1和3。最主要的差别是从ACB变为BAC。因为B在这里充当了之前A的角色,A充当了之前C的角色,C充当了之前B的角色(辅助柱子是不一样的)。然后其实这是一个递归(分治)问题,递归问题主要是要找到n和n-1之间的联系。当n-1和n的操作类似时,就可以使用递归(逆推的思想)。
相关文章推荐
- C++实现汉诺塔问题
- 汉诺塔问题的的c++实现
- 3行核心代码解决汉诺塔问题(C++递归实现)
- 汉诺塔问题C++的递归实现 [
- 最短路径问题——Dijkstra算法(C++实现)
- 约瑟夫问题C++实现
- C++实现 八皇后问题及其扩展N皇后问题(经典回溯算法)
- 个人研究《数据结构与算法分析-C++描述》Vector实现的问题,new与初始化
- 仿MFC实现c++按名动态创建对象之续(瘦身以及解决其在dll中使用的问题)
- STL学习笔记:用非递归的方法实现汉诺塔问题
- VC++编译问题汇总1 单链表的表示和实现,基于c++
- 《数据结构与算法分析-C++描述》List实现的问题,g++太符合标准,以至于有的时候虽然正确,但是却会让你吃惊
- n后问题的c++实现
- socket简单实现ftp的文件传送(C++V2.0版,解决数据丢失问题)
- Singleton的C++实现 及相关问题
- php实现汉诺塔问题(递归)
- 从易到难编写C++程序,(4)问题:实现一个大整数表示的BigInt类
- 从易到难编写C++程序,(8)问题:实现一个矩阵类
- 从易到难编写C++程序,(5)问题:实现满足各种需求的随机整数生成类RandCreater
- C/C++实现HTTP/HTTPS的POST存在的问题