游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
析:对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但我们可以利用下面的方法来解决。设移动盘子数为n,为了将这n个盘子从A杆移动到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 movedisks(int disknum,char sourcepole,char targetpole,char midpole);
int main()
{
movedisks(4,'a','c','b');//4个盘子的情况
}
void movedisks(int disknum,char sourcepole,char targetpole,char midpole)
{
if (disknum==1)
{
cout<<sourcepole<<"->"<<targetpole<<endl;
}
else
{
movedisks(disknum-1, sourcepole, midpole, targetpole);
cout<<sourcepole<<"->"<<targetpole<<endl;
movedisks(disknum-1, midpole, targetpole, sourcepole);
}
}