1. 程式人生 > >【資料結構與演算法】遞迴漢諾塔

【資料結構與演算法】遞迴漢諾塔

漢諾塔

漢諾塔是根據一個傳說形成的數學問題(關於漢諾塔):
有三根杆子A,B,C。A杆上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C杆:
每次只能移動一個圓盤;
大盤不能疊在小盤上面。
提示:可將圓盤臨時置於B杆,也可將從A杆移出的圓盤重新移回A杆,但都必須遵循上述兩條規則。

遞迴漢諾塔

解題思路: 可以把問題簡化成2個盤子的情況,如:A上有兩個盤子,B和C是空的。如果要把A的兩個盤子全部移動到C,需要經過以下步驟:
1.A移動一個盤子到B
2.A移動一個盤子到C
3.B移動一個盤子到C
到這裡已經把所有盤子移動到C盤,其實可以把底盤上面的盤子看成一個整體,這就簡化成3步了,然後使用遞迴重複這3個步驟就完成了所有盤子的位移。 使用遞迴解漢諾塔,並實時列印每一步的變化和計算步數。
#include 
#include 

std::string ga ("987654321");
std::string gb ("");
std::string gc ("");
// 步數(最少移動2^n - 1次才能完成。)
static int step = 0;

FILE* file = NULL;

// count是盤子的數量
void han(int count, std::string &a, std::string &b, std::string &c){

	if (count < 1)
	{
		return;
	}

	// A --> B
	han(count-1, a, c, b);

	//遞迴的一個特點:每一個步驟都依賴上一個步驟的結果。
	// A --> C
	c.append(1,*(a.end()-1));
	a.erase(a.end()-1);	

	// 計數
	++step;
	// 實時列印a、b、c的變化
	std::cout<<"a = "< C	
	han(count-1, b, a, c);	
}

void main(){

	file = fopen("han.txt","w");

	std::cout<<"a = "<