問題の説明:
ハノイの塔:ハノイの塔(ハノイの塔とも呼ばれます)は、インドの古代の伝説に由来する教育玩具です。ブラフマが世界を創造したとき、彼は3本のダイヤモンドの柱を作り、1本の柱に64枚の黄金の円盤を下から上にサイズ順に積み上げました。ブラフマーはブラフミンに、円盤を下から別の柱に大きさ順に並べ直すように命じました。また、小さなディスク上でディスクを拡大することはできず、3つの柱の間で一度に移動できるディスクは1つだけであると規定されています。(つまり、小さなプレートは大きなプレートの上にある必要があり、一度に移動できるのは1つのプレートだけです。最後に、Aより上のすべてのプレートがCに移動されます)。
考え:現在2つのプレートがあると仮定すると、小さなプレートを直接AからBに移動し、次に大きなプレートをAからCに移動し、最後に小さなプレートをBからCに移動できます。実際、64枚のプレートは同じです。上部の63枚のプレートは全体として考えることができます。最初に63枚のプレートをAからBに移動し、次に下部のプレートをAからCに移動してから、63枚のプレートをBからCに移動します。63プレートを移動する方法は?上記の62を全体として考えます。。。類推によれば、それは実際には、最も単純なケースに至るまで、再帰です。
#include <cassert>
using namespace std;
#define length 3
#include<iostream>
using namespace std;
int main()
{
void hanoi(int n, char one, char two, char three);
int m;
cout << "输入盘子数:";
cin >> m;;
hanoi(m, 'A', 'B', 'C');
}
void hanoi(int n, char one, char two, char three)
{
void move(char x, char y);
if (n == 1)
{
move(one, three);//递归结束条件。此时只有一个盘子
}
else
{
hanoi(n - 1, one, three, two);//将上面n-1个盘子从A移动到B,(可以借助C)
move(one, three);//输出
hanoi(n - 1, two, one, three);将上面n-1个盘子从B移动到C(借助A)
}
}