汉诺塔问题
题意
将A 柱子上的块转移到 C 上
条件1 - 每次只能转移一块
条件2 - 大块不能压小快
解析
概念原理
冰箱装大象问题 :
1. 打开冰箱
2. 放入大象
3. 关上冰箱
类比在 任何一个块 n 来说:
1. 把上面的块都移动好
2. n 块移动过去
3. 之前上面的块在放在 n 块上面
简化问题, 考虑 123块的移动, 可以考虑成我想移动 3 . 必然要移动12
同理 我想移动 2, 必然要移动 1 , 即关系为
f(3) ---> f(2) ---> f(1) 问题分解为 3, 2, 1 块的独立流程, 即反向推引
f(3) ==> f(1) + (2) 3 块的前提是 2,1 的问题处理
f(2) ==> f(1) 2 块的前提是 1 的问题处理
流程解析
用人来比喻的话, 每个块都有个工人负责
工人n 有三个能力
1. 只能移动 第 n 块到任何柱子
2. 工人 n 可以叫人帮他处理压在他上面的块 (让 工人n-1 处理)
3. 工人 n 最后的工作是搬动 第n 块到目标柱子上
搬动的时候要确定的是你要从哪个柱子搬到哪个柱子。
题目中有三个柱子。 第一个起始柱子, 第三个目标柱子, 那剩下一个就是转移柱
转移柱子可以作为中转站, 最终目标是到三柱。
在步骤三之前。 只能将上面的块都放在中转的二柱上
代码实现
def hnt(index, start, mid, end): # 最后的人只有一个工作就是把第一个块移动到终点 if index == 1: print "{}--->{}".format(start, end) else: # 叫人来把上面的块搬走, 先放在 mid 上做中转 hnt(index - 1, start, end, mid) # 自己把自己的块搬到目标柱 print "{}--->{}".format(start, end) # 叫人把之前的块搬回来, 之前在 mid 上, 现在要放在 end 上, 用 start 中转 hnt(index - 1, mid, start, end) if __name__ == ‘__main__‘: hnt(3, "A", "B", "C") # A--->C # A--->B # C--->B # A--->C # B--->A # B--->C # A--->C
原文地址:https://www.cnblogs.com/shijieli/p/12606985.html
时间: 2024-11-09 19:33:03