1. 程式人生 > >演算法:漢諾塔(棧的遞迴呼叫)-資料結構(9)

演算法:漢諾塔(棧的遞迴呼叫)-資料結構(9)

一、問題描述

參見網上漢諾塔的玩法。書上P54-58。解析:棧的遞迴呼叫其實是函式引數是以棧的形式push進棧來呼叫函式的,因此遞迴是用到棧的,只是沒有很形象而已。解決漢塔的思路是這樣的:設n為漢諾塔的盤子數,xyz是三根柱子。要讓z有n個盤子的做法,先是將x的n-1個盤子移到y,然後將第n個盤子移到z,就這樣的思路進行下去,最後就可以把漢諾塔的問題解決了。

二、演算法實現

int c = 0;
void  move(char x,int n,char z){
	printf("%d Move dist %d from %c to %c \n",++c,n,x,z);
}
void hanoi(int n,char x,char y,char z){
	//漢諾塔的盤的個數n x,y,z分別是柱子
	if (n == 1)
	{
		//移動一個情況下 直接移動
		move(x, 1, z);//將1號圓盤 從x放到z
	}
	else{
		hanoi(n-1,x,z,y);//將x上的n-1個盤子 放到y上
		move(x,n,z);//然後將第n個盤子放到z上
		hanoi(n-1,y,x,z);//將y上的n-1個盤子放到z上
	}
}

三、執行

//漢諾塔
	hanoi(3, 'x', 'y', 'z');
輸出:
1 Move dist 1 from x to z
2 Move dist 2 from x to y
3 Move dist 1 from z to y
4 Move dist 3 from x to z
5 Move dist 1 from y to x
6 Move dist 2 from y to z
7 Move dist 1 from x to z
請按任意鍵繼續. . .