汉诺(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)
所完成的。

猜你喜欢

转载自blog.csdn.net/Mayouhpevrday/article/details/82779526