您的位置:首页 > 编程语言 > C语言/C++

汉诺塔问题(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杆。

代码:

#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++ 递归 分治