1. 程式人生 > >漢諾(Hanoi)塔問題的遞迴解決

漢諾(Hanoi)塔問題的遞迴解決

漢諾塔問題:
古代有一個塔,塔內有3個座A、B、C,開始時A座有64個盤子,盤子大小不相等,大的在下,小的在上。有一個老和尚想把這64個盤子從A座移動到C座,但每次只允許移動一個盤,且在移動過程中在3個座上都始終保持大盤在下,小盤在上。在移動過程中可以利用B座,要求程式設計打印出移動的步驟。

#include <stdio.h>
void move(char x, char y)
{
	printf("%c-->%c\n", x, y);
}

void hanoi(int n, char one, char two, char three)
/*將n個盤從one座藉助two座,移動到three座*/
{
	if( n==1 ) move(one,three);
	else
	{
		hanoi(n-1, one, three, two);
		move(one, three);
		hanoi(n-1, two, one, three);
	}
}

main()
{
	int m;
	printf("input the number of disks:");
	scanf("%d",&m);
	printf("The step to moving % 3d disks:\n", m);
	hanoi( m,'A','B','C');
}

解決思想:和尚想,如果有一個和尚能把63個盤子從一個座移動到另一個座,那麼問題就解決了,此時,老和尚可以通過3步完成:
1)命令第2個和尚把63個盤子從A座移動到B座;
2)把第64個(最大的那個)盤子從A座移動到C座;
3)命令第2個和尚把63個盤子從B座移動到C座。
這樣這個問題就解決了。但是,怎麼樣移動這63個盤子呢,於是第2個又命令第3個和尚完成62個盤子移動到另一個座的任務…
通過一層一層往下,第63個和尚命令第64個和尚,讓他完成從把1個盤子一個座移動到另一個座。這樣問題就變得十分簡單了。
為了簡化任務,先完成將A座上3個盤子移動到C座的過程:
1)將A做兩個盤子移動到B座(藉助C);
2)將A座的最後一個盤子移動到C座;
3)將B座上兩個盤子移動到C座(藉助A)。
其中,第2步可以直接解決,第1步細化為:1)將A上1個盤子從A移動到C;2)將A上1個盤子從A移動到B;3)將C上1個盤子從C移動到B。
第3步細化為:1)將B上1個盤子從B移動到A;2)將B上1個盤子從B移動到C;3)將A上1個盤子從A移動到C;
這一段就是程式碼中void hanoi(int n, char one, char two, char three)
所完成的。