标签:
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?
这个问题也就是著名的汉诺塔问题,以上对问题的描述摘于维基百科(因为懒,所以不手打了),对于这个问题的详细描述请点击一下维基百科的页面。
对于这个问题,刚开始确实不太好理解,不过我们可以从三个圆盘开始,最简单的方法就是拿扑克牌自己模拟以下,反正我是这么做的,感觉效果还是很不错的。
其主要的思想就是递归,将问题一步一步化解为base case。
主要步骤:
1》 用C柱做过渡,将A柱上的(n - 1)个盘子移到B柱上。
2》 将A柱上的最后一个盘子直接移到C柱上。
3》 用A柱做过渡,将B柱上的(n - 1)个盘子移到C柱上。
其中要注意的几点,如果盘子只有三四个,我们可以手动实现移动的过程。但是盘子一旦超过5个,其递归的层数就相对很深了,我们就要把这个问题交给计算机了。每当把最后一个大盘子移到C柱上,这个问题就相对化简了一次,问题的规模也变成了n - 1,然后一直递归,最后就成了1。
下面用Python实现的代码:
def printMove(fr, to): print('move from ' + str(fr) + ' to ' + str(to)) # n for numbers, fr for A, to for C, spare for B def Towers(n, fr, to, spare): if n == 1: printMove(fr, to) else: Towers(n-1, fr, spare, to) Towers(1, fr, to, spare) Towers(n-1, spare, to, fr)
标签:
原文地址:http://blog.csdn.net/wzqnls/article/details/45200307