hanoi塔

問題描述:

在Hanoi這個地方有一個寺廟,這裏有3根柱子和64個大小不同的金碟子。每個碟子有一個孔可以穿過。所有的碟子都放在第一個柱子上,
而且按照從上到下碟子的大小依次增大的順序擺設


  現在,假定寺廟裏的僧侶要移動這些碟子,將它們從最左邊移動到最右邊的柱子上。不過移動的規則如下:
1. 每次只能從一個柱子的最上面移動一個碟子到另外一個柱子上。
2. 不能將大碟子放到小碟子的上面。
按照前面這個規則,我們該怎麼去移動這些碟子呢?假定單位時間內可以移動一片碟子,那麼最終移動這些碟子到目的柱子需要多長的時間呢?


問題分析:

假設有一個盤子,編號爲1,將1 從A挪到C,共一步;
假設有兩個盤子,依次編號(從上到下,下同)1、2,最少步驟:1 從A挪到B,2從A挪到C,最後將1 從B挪到C,共計三步;
假設有三個盤子,依次編號1、2、3,少步驟:1 從A挪到C,2從A挪到B,1從C挪到B,3從A挪到C,1從B挪到A,2從B挪到C,1從A挪到C,共計七步;
....
從上邊,我們可以看出,若要完成n階漢諾塔,則最少要移動[2的n次方)-1]次,當然無關緊要,通過分析可以看出,hanoi塔在移動時第一步總是將除最底層的當然也是最大的圓盤(n圓盤)之外的所有的圓盤挪動到B塔(以C塔爲輔助塔),第二步則是將最大的圓盤挪動到C塔(A塔當作輔助塔),最後將剩下所有的圓盤挪動到C塔,那麼就可以通過程序模擬這種過程,將整個塔看作兩部分,第一部分1到n-1個圓盤,第二部分是第n個圓盤,那麼邏輯上就三步,第一步要以B爲主塔,C爲輔塔,將1~n-1的圓盤挪動到B塔;第二步將n圓盤做到C;最後以A塔當作輔助塔,將除n盤外所有圓盤挪動到C盤

代碼:

//編譯已通過
#include <iostream>
using namespace std;
void move(int n, char a,char b){
	cout << "編號" << n << " " << a<<"-->"<< b<<endl; 
}
void hanoi(int n,char x,char y,char z){
	if(n >= 1){
		hanoi(n-1,x,z,y);//將x上編號爲1到n-1的圓盤移到y,z作輔助塔
		move(n,x,z);	//將編號爲n的圓盤從x移到z
		hanoi(n-1,y,x,z);//將y上編號爲1到n-1的圓盤移到z,x作輔助塔
	}
}
int main()
{
	int num;
	char x,y,z;
	cin >> num >> x >> y >> z;
	hanoi(num,x,y,z);
	return 0;
}



代碼分析:

以三個圓盤爲例,塔標爲A、B、C,
運行結果:
關於這個遞歸程序通過跟蹤程序的方法來分析解讀(1~24爲程序運行步驟,層數爲遞歸層數,第一層爲最外層依次遞增)

第一層

1 hanoi(3ABC)

 

 

 

12 move(3AC)

 

 

 

24END

第二層

2 hanoi(2ACB)

 

7 move(2AB)

 

13 hanoi(2BAC)

 

19 move(2BC)

 

 

第三層

3 hanoi(1ABC)

5 move(1AC)

8 hanoi(1CBA)

10hanoi(1CB)

14 hanoi(1BCA)

16 move(1BA)

20 hanoi(1ABC)

22 move(1AC)

 

第四層

4 hanoi(0ACB)

6 hanoi(0BAC)

9hanoi(0CBA)

11 hanoi(0ACB)

15 hanoi(0BAC)

17 hanoi(0CBA)

21 hanoi(0ACB)

23 hanoi(0BAC)

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章