汉诺塔问题非递归算法

奇数次移动,将最小的圆盘移到顺时针方向的下一个圆柱上,偶数次移动,将第二小的圆盘移动到另一个圆柱上

#汉诺塔非递归
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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值