漢諾塔問題

/*********************************************************************
程序思想:問題是把A柱上的所有盤子也是由上到下按從小到大移動到C柱上去,
中間有B柱可以做過渡,此程序用遞歸的思想去實現。
先假設A柱只有一個盤子,則可以將該盤從A直接移到C上,即A->C
假設有兩個盤子,則移動的次序爲A->B,    A->C,         B->C
假設有三個盤子,則移動的次序爲A->C,A->B,C->B, A->C,B->A,B->C,A->C
可以發現,不管盤子有多少我們的思想就是先把N個盤子上面的N-1個通過C先從A

移動到B
然後就把最大的盤子放到了C上了,此時A已空,我們把B上的所有盤子按照上面的

方法把最底下的
移到C上去,然後又把在A上的盤子再用上面的方法把最底下的移到C上去,如此遞

歸就可完成任務

***********************************************************************

*********************/
#include <iostream>
using namespace std;
typedef int PlateNum;//其實這裏沒這個必要呢,但是在大型的工程裏面這樣用

好點

void Move(char One,char Another)
//移動函數
{
 cout<<"把"<<One<<"上的盤子移動到"<<Another<<"上"<<endl;
}


void Hanoi(PlateNum m,char A,char B,char C)
//漢諾塔有三個柱子A B C,有m個盤子,把A上的通過B全部移動到C上
{
 if(1==m)
  Move(A,C);  //只有一個盤子的時候就直接把盤

子從A移到C
 else    //多於一個的話……
 {
  Hanoi(m-1,A,C,B); //先把m-1個盤子從A同過移動到B
  Move(A,C);   //此時A上只有一個最大的

了,那就把它移動到C上去
  Hanoi(m-1,B,A,C); //此時B上有m-1個盤子,在用上面

的方法把B上的盤子全部移動到C上,依次類推

 }
}

 

int main()
{
 PlateNum m ;
 cout<<"請輸入盤子的數目:";
 cin>>m;
 cout<<m<<"個盤子的漢諾塔的移動次序爲:"<<endl;
 Hanoi(m,'A','B','C');
 return 1;
 
}

 

發佈了28 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章