汉诺塔问题:将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
********************************************************************************