zoukankan      html  css  js  c++  java
  • 用 python 解决汉诺塔问题并附带演示过程

    一、使用工具 IDLE

    二、汉诺塔代码

    import turtle
    
     
    
    class Stack:
    
        def __init__(self):
    
            self.items = []
    
        def isEmpty(self):
    
            return len(self.items) == 0
    
        def push(self, item):
    
            self.items.append(item)
    
        def pop(self):
    
            return self.items.pop()
    
        def peek(self):
    
            if not self.isEmpty():
    
                return self.items[len(self.items) - 1]
    
        def size(self):
    
            return len(self.items)
    
     
    
    def drawpole_3():#画出汉诺塔的poles
    
        t = turtle.Turtle()
    
        t.hideturtle()
    
        def drawpole_1(k):
    
            t.up()
    
            t.pensize(10)
    
            t.speed(100)
    
            t.goto(400*(k-1), 100)
    
            t.down()
    
            t.goto(400*(k-1), -100)
    
            t.goto(400*(k-1)-20, -100)
    
            t.goto(400*(k-1)+20, -100)
    
        drawpole_1(0)#画出汉诺塔的poles[0]
    
        drawpole_1(1)#画出汉诺塔的poles[1]
    
        drawpole_1(2)#画出汉诺塔的poles[2]
    
     
    
    def creat_plates(n):#制造n个盘子
    
        plates=[turtle.Turtle() for i in range(n)]
    
        for i in range(n):
    
            plates[i].up()
    
            plates[i].hideturtle()
    
            plates[i].shape("square")
    
            plates[i].shapesize(1,8-i)
    
            plates[i].goto(-400,-90+20*i)
    
            plates[i].showturtle()
    
        return plates
    
     
    
    def pole_stack():#制造poles的栈
    
        poles=[Stack() for i in range(3)]
    
        return poles
    
     
    
    def moveDisk(plates,poles,fp,tp):#把poles[fp]顶端的盘子plates[mov]从poles[fp]移到poles[tp]
    
        mov=poles[fp].peek()
    
        plates[mov].goto((fp-1)*400,150)
    
        plates[mov].goto((tp-1)*400,150)
    
        l=poles[tp].size()#确定移动到底部的高度(恰好放在原来最上面的盘子上面)
    
        plates[mov].goto((tp-1)*400,-90+20*l)
    
     
    
    def moveTower(plates,poles,height,fromPole, toPole, withPole):#递归放盘子
    
        if height >= 1:
    
            moveTower(plates,poles,height-1,fromPole,withPole,toPole)
    
            moveDisk(plates,poles,fromPole,toPole)
    
            poles[toPole].push(poles[fromPole].pop())
    
            moveTower(plates,poles,height-1,withPole,toPole,fromPole)
    
     
    
    myscreen=turtle.Screen()
    
    drawpole_3()
    
    n=int(input("请输入汉诺塔的层数并回车:
    "))
    
    plates=creat_plates(n)
    
    poles=pole_stack()
    
    for i in range(n):
    
        poles[0].push(i)
    
    moveTower(plates,poles,n,0,2,1)
    
    myscreen.exitonclick()
    

    三、运行结果(输入层数为5)

      

  • 相关阅读:
    ionic localstorage
    angular 中文鏈接
    把jqmobi 變成jQuery 的插件 從此使用jQuery
    jqmobi 的一些設置
    ionic ngcordova map 地圖
    ionic pull to refresh 下拉更新頁面
    json 對象的序列化
    鍵盤彈出,頁面佈局被推上去了.....
    Cordova V3.0.0中config.xml配置文件的iOS Configuration
    android ios 只能輸入數字 不能輸入小數點的 函數 cordova
  • 原文地址:https://www.cnblogs.com/shinawear/p/10611431.html
Copyright © 2011-2022 走看看