奇数次移动,将最小的圆盘移到顺时针方向的下一个圆柱上,偶数次移动,将第二小的圆盘移动到另一个圆柱上
#汉诺塔非递归
def findmin(top):
if top[0]>top[1]:
if top[1]>top[2]:
return (top[2],2)
else:
return (top[1],1)
else:
if top[0]>top[2]:
return (top[2],2)
else:
return (top[0],0)
def Hanoi(n):
top=[1,n+1,n+1]
A=[[0,0,0] for i in range(0,n)]
for i in range(0,n):
A[i][0]=i+1
toppos=[0,n,n]
flag=1
while toppos[1]>0:
if flag==1:
(min,x)=findmin(top)
y=(x+1)%3
top[y]=top[x]
A[toppos[y]-1][y]=top[y]
toppos[x]=toppos[x]+1
toppos[y]=toppos[y]-1
if toppos[x]<n:
top[x]=A[toppos[x]][x]
else:
top[x]=n+1
A[toppos[x]-1][x]=0
flag=0
print("Move %d"%top[y]+" from A[%d]"%x+"to A[%d]"%y)
else:
(min,i)=findmin(top)
x=(i+1)%3
y=(i+2)%3
if top[x]<top[y]:
top[y]=top[x]
A[toppos[y]-1][y]=top[y]
toppos[x]=toppos[x]+1
toppos[y]=toppos[y]-1
if toppos[x]<n:
top[x]=A[toppos[x]][x]
else:
top[x]=n+1
A[toppos[x]-1][x]=0
print("Move %d"%top[y]+" from A[%d]"%x+"to A[%d]"%y)
else:
top[x]=top[y]
A[toppos[x]-1][x]=top[x]
toppos[y]=toppos[y]+1
toppos[x]=toppos[x]-1
if toppos[y]<n:
top[y]=A[toppos[y]][y]
else:
top[y]=n+1
A[toppos[y]-1][y]=0
print("Move %d"%top[x]+" from A[%d]"%y+"to A[%d]"%x)
flag=1
return
Hanoi(5)