[python]汉诺塔问题求解

towers of hanoi
汉诺塔问题:将A塔上的5个圆盘移动到C塔上
可以用递归的思路来求解该问题,为了使问题一般化,假设要移动n个圆盘。根据递归的思路,可以考虑先把上面n-1个圆盘移动到B塔上,然后将最底下的n号圆盘移动到C塔,再将B塔上n-1个圆盘移动到C塔。
Python实现

#towers of hanoi 汉诺塔问题
def extList(L,length=5):
    if len(L) == length:
        return L[:]
    l = L[:]
    l.extend([0]*(length-len(l)))
    return l

def disState():
    ta = extList(TA,LENGTH)
    tb = extList(TB,LENGTH)
    tc = extList(TC,LENGTH)
    print 'A   B   C'
    for i in range(LENGTH-1,-1,-1):
        print '%d   %d  %d' % (ta[i],tb[i],tc[i])
    print '*' * 80

def move(N,frompeg,topeg,auxpeg):
    if N == 1:
        print 'move disk %d from %s to %s' % (N,frompeg,topeg)
        exec 'disk = T%s.pop()' % frompeg
        exec 'T%s.append(disk)' % topeg
        disState()
        return
    move(N-1,frompeg,auxpeg,topeg)
    print 'move disk %d from %s to %s' % (N,frompeg,topeg)
    exec 'disk = T%s.pop()' % frompeg
    exec 'T%s.append(disk)' % topeg
    disState()
    move(N-1,auxpeg,topeg,frompeg)

if __name__ == '__main__':
    #定义总共有多少个圆盘,这里假设有5个圆盘
    LENGTH = 5
    #假设这5个圆盘一开始放在‘A’号塔上,摆放顺序类似于堆栈,顶部存放1号圆盘,底部存放5号圆盘
    TA = [i for i in range(LENGTH,0,-1)]
    #‘B’号塔,初始化为空
    TB = []
    #‘C’号塔,初始化为空
    TC = []
    disState()
    #将‘A’号塔上的圆盘全部移动到‘C’号塔,‘B’号塔作为中转塔
    move(LENGTH,'A','C','B')

5个圆盘的输出结果

>>> 
A   B   C
1   0   0
2   0   0
3   0   0
4   0   0
5   0   0
********************************************************************************
move disk 1 from A to C
A   B   C
0   0   0
2   0   0
3   0   0
4   0   0
5   0   1
********************************************************************************
move disk 2 from A to B
A   B   C
0   0   0
0   0   0
3   0   0
4   0   0
5   2   1
********************************************************************************
move disk 1 from C to B
A   B   C
0   0   0
0   0   0
3   0   0
4   1   0
5   2   0
********************************************************************************
move disk 3 from A to C
A   B   C
0   0   0
0   0   0
0   0   0
4   1   0
5   2   3
********************************************************************************
move disk 1 from B to A
A   B   C
0   0   0
0   0   0
1   0   0
4   0   0
5   2   3
********************************************************************************
move disk 2 from B to C
A   B   C
0   0   0
0   0   0
1   0   0
4   0   2
5   0   3
********************************************************************************
move disk 1 from A to C
A   B   C
0   0   0
0   0   0
0   0   1
4   0   2
5   0   3
********************************************************************************
move disk 4 from A to B
A   B   C
0   0   0
0   0   0
0   0   1
0   0   2
5   4   3
********************************************************************************
move disk 1 from C to B
A   B   C
0   0   0
0   0   0
0   0   0
0   1   2
5   4   3
********************************************************************************
move disk 2 from C to A
A   B   C
0   0   0
0   0   0
0   0   0
2   1   0
5   4   3
********************************************************************************
move disk 1 from B to A
A   B   C
0   0   0
0   0   0
1   0   0
2   0   0
5   4   3
********************************************************************************
move disk 3 from C to B
A   B   C
0   0   0
0   0   0
1   0   0
2   3   0
5   4   0
********************************************************************************
move disk 1 from A to C
A   B   C
0   0   0
0   0   0
0   0   0
2   3   0
5   4   1
********************************************************************************
move disk 2 from A to B
A   B   C
0   0   0
0   0   0
0   2   0
0   3   0
5   4   1
********************************************************************************
move disk 1 from C to B
A   B   C
0   0   0
0   1   0
0   2   0
0   3   0
5   4   0
********************************************************************************
move disk 5 from A to C
A   B   C
0   0   0
0   1   0
0   2   0
0   3   0
0   4   5
********************************************************************************
move disk 1 from B to A
A   B   C
0   0   0
0   0   0
0   2   0
0   3   0
1   4   5
********************************************************************************
move disk 2 from B to C
A   B   C
0   0   0
0   0   0
0   0   0
0   3   2
1   4   5
********************************************************************************
move disk 1 from A to C
A   B   C
0   0   0
0   0   0
0   0   1
0   3   2
0   4   5
********************************************************************************
move disk 3 from B to A
A   B   C
0   0   0
0   0   0
0   0   1
0   0   2
3   4   5
********************************************************************************
move disk 1 from C to B
A   B   C
0   0   0
0   0   0
0   0   0
0   1   2
3   4   5
********************************************************************************
move disk 2 from C to A
A   B   C
0   0   0
0   0   0
0   0   0
2   1   0
3   4   5
********************************************************************************
move disk 1 from B to A
A   B   C
0   0   0
0   0   0
1   0   0
2   0   0
3   4   5
********************************************************************************
move disk 4 from B to C
A   B   C
0   0   0
0   0   0
1   0   0
2   0   4
3   0   5
********************************************************************************
move disk 1 from A to C
A   B   C
0   0   0
0   0   0
0   0   1
2   0   4
3   0   5
********************************************************************************
move disk 2 from A to B
A   B   C
0   0   0
0   0   0
0   0   1
0   0   4
3   2   5
********************************************************************************
move disk 1 from C to B
A   B   C
0   0   0
0   0   0
0   0   0
0   1   4
3   2   5
********************************************************************************
move disk 3 from A to C
A   B   C
0   0   0
0   0   0
0   0   3
0   1   4
0   2   5
********************************************************************************
move disk 1 from B to A
A   B   C
0   0   0
0   0   0
0   0   3
0   0   4
1   2   5
********************************************************************************
move disk 2 from B to C
A   B   C
0   0   0
0   0   2
0   0   3
0   0   4
1   0   5
********************************************************************************
move disk 1 from A to C
A   B   C
0   0   1
0   0   2
0   0   3
0   0   4
0   0   5
********************************************************************************
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值