汉诺塔游戏三条规则:
1、一次搬动一只盘子
2、每根柱子上只有最上方的盘子可以动
3、大盘子不可置于小盘子上
迭代实现:
def hanoi(n,disk):
'''
n: 盘子数
disk: 长度为n的数组,每个位置为该盘子目前所在柱子编号(0,1,2),初始全为0
盘子从上到下编号依次增大,1 -> n
'''
if n % 2 == 0:
for i in range(1,2**n):
#step 1
k = 0
while i % 2 == 0:
k += 1
i /= 2
#step 2
if (k+1)%2 == 0:
disk[k] = (disk[k] - 1)%3
else:
disk[k] = (disk[k] + 1)%3
else:
for i in range(1,2**n):
#step 1
k = 0
while i % 2 == 0:
k += 1
i /= 2
#step 2
if (k+1)%2 == 0:
disk[k] = (disk[k] + 1)%3
else:
disk[k] = (disk[k] - 1)%3
return disk
#example
n = 7
disk = [0]*n
print(hanoi(n,disk))
递归实现:
def hanoi(n,A,C,B):
'''
n: 为汉诺塔盘子数量
A,B,C:分别问三个柱子编号,在这里用三个数组存放盘子编号
'''
if not n:
return
hanoi(n-1,A,B,C)
#A -> C
C.append(A.pop())
hanoi(n-1,B,C,A)
return C
#example
n = 7
A = [i for i in range(n,0,-1)]
C = []
B = []
print(hanoi(n,A,C,B))
参考书籍:
俞征武 《图解算法》第一章