糾結了好久才弄得明白一點點的漢諾塔問題,現在把一些方程與大家分享一下!
這個程序是目的是:將A柱上的金盤移到B柱上
//從A到B
#include < iostream >
using namespace std;
void move(int inum, char from, char to);
void hanoi(int inum, char a, char b, char c);
void main()
{
int inum;
cout << "Please input the number of Gold Disk :" << endl;
cin >> inum;
cout << "當金盤數為"<< inum
<< "時將A上的金盤移動到B上的步驟為:"
<< endl;
hanoi(inum, 'A', 'B', 'C'); // 借助C,將A上的金盤移動到B上
}
void move(int inum, char from, char to)
{
cout << inum <<" :" << from << "移動到" << to << endl;
}
void hanoi(int inum, char a, char b, char c)
{
if (inum == 1) //每一次遞歸的終止條件
move(inum, a, b); //將第inum個金盤直接移動到B上
else
{
hanoi(inum-1, a, c, b); //將inum-1個金盤借助於B,從A移動到C上
move(inum, a, b); //將第inum個個金盤直接從A移動到B上
hanoi(inum-1, c, b, a); //將第inum-1個金盤借助於A,從C移到B上,就可以完成了目的
} //即從A上的金盤全部移到B上
}
以下隻分析inum = 3的情況:
當inum = 3 時:程序其實是:
hanoi(3, A,B,C)
{
if(為1)
move(1, A,B); //將第inum個金盤直接移動到B上
else
{
@1: hanoi(2,A,C,B); //將inum-1個金盤借助於B,從A移動到C上
@2: move(2,A,B); //將第inum個個金盤直接從A移動到B上
@3: hanoi(2,C,B,A); //將第inum-1個金盤借助於A,從C移到B上,就可以完成了目的
}
}
===>>>
@1: 先執行這個
hanoi(2, A,C,B)
{
if(為1)
move(1, A,C);
else
{
hanoi(1,A,B,C);
move(2,A,C);
hanoi(2,B,C,A);
}
}
hanoi(1, A,B,C)
{
if(為1)
move(1, A,B); // 1:A移到B
else
{
//這部分不用看了,,在此不修改了!
}
}
===================================================================
@2:再執行這個:
move(2,A,C); //2:輸出A到C
@3:再執行這個:
hanoi(2,B,C,A); //這裏就不一一列出來了,輸出結果應該是: 1:B移到C 3:A移動到B
最後就執行move:
2:C移動到B 1:A移到B
大家有什麼補充請補充一下,謝謝,互相學習學習!
最後更新:2017-04-02 06:51:39