问题描述:有三根杆(编号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的操作类似时,就可以使用递归(逆推的思想)。