1. 程式人生 > >hanoi塔問題的遞迴實現

hanoi塔問題的遞迴實現

一、背景故事

法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。(來自百度百科)

二、問題描述


假設有x,y,z三座塔座。在塔座x上有n個直徑各不相同、依次從小到大的編號為1,2.........,n的圓盤。現要求將x座上的盤子移動到z上,移動要求如下:

1、一次只能移動一個盤子。

2、盤子只能插在x,y,z的某個塔座上。

3、任何時刻不能將較大的盤子壓在較小的盤子上。

如何移動盤子呢?當只有一個盤子時,即n=1。此時直接將x上的盤子移動到z上即可。當n等於2時,先將第一個盤子移動到y上,再將第二個盤子移動到z上,最後將y上的盤子移動到z上。當n大於1的時候,將上面n-1個盤子通過z移動到y上,再將x上的一個盤子移動到z上,再將y上的盤子通過x移動到z上......

三、程式

#include<stdio.h>

void hanoi(int n,char a,char b,char c)
{
	if(n==1)
		printf("%c-->%c\n",a,c);
	else
	{
		hanoi(n-1,a,c,b);//將a上的盤子通過c移動到b上,這句話很好 
		printf("%c-->%c\n",a,c);//可以仔細想想這c是什麼柱子,挺好玩的 
		hanoi(n-1,b,a,c); 
	}
}

void main()
{
	hanoi(5,'x','y','z'); 
}