python 游戲 —— 漢諾塔(Hanoita)

一、漢諾塔問題

1. 問題來源

  問題源于印度的一個古老傳說,大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

2. 問題闡述

  塔內有三個座A、B、C,A座上有64個盤子,盤子從上到下逐漸變大,最下面的盤子最大。目前要把A座的64個盤子從A座移到C座,并且每次只能移動一個盤子,移動過程中三個座保持大盤子在下,小盤子在上,要求輸出盤子的移動過程。

?

二、問題解析

1. 解決方法:遞歸方法

2. 解題過程

  (1) 將上面63個盤子從A座移到B座

  (2) 將最下面的盤子從A座移到C座

  (3) 將B座的63個盤子從B座移到C座

?

三、問題解決

1. 非可視化解決

  (1) 代碼實現

''' 編程環境:python3.7  win7x64 '''def printf(A,C):  #盤子移動的輸出格式print("{} --> {}".format(A,C))def move(n,A,B,C):if n == 1:printf(A,C)     #將最后1個盤子從A座移到C座else:move(n-1,A,C,B) #將n個盤子從A座借助B座移到C座printf(A,C)     #將最后1個盤子從A座移到C座move(n-1,B,A,C) #將n個盤子從B座借助A座移到C座N = int(input("請輸入漢諾塔層數:"))move(N,'A','B','C')

  (2) 有圖有真相

?

2. 可視化解決

?  (1) 代碼實現

''' 編程環境:python3.7  win7x64 '''from turtle import *class Stack:def __init__(self):self.items = []def isEmpty(self):return len(self.items) == 0def 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_1(k):#畫漢諾塔的底座up()pensize(10)speed(100)goto(400*(k-1), 100)down()goto(400*(k-1), -100)goto(400*(k-1)-20, -100)goto(400*(k-1)+20, -100)def drawpole_3():#畫出漢諾塔的三個底座hideturtle()#隱藏drawpole_1(0)#畫出漢諾塔的底座左drawpole_1(1)#畫出漢諾塔的底座中drawpole_1(2)#畫出漢諾塔的底座右def creat_plates(n):#制造n個盤子plates=[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 platesdef pole_stack():#制造底座的棧poles=[Stack() for i in range(3)]return polesdef 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=Screen()setup(1200,500) #設置窗口大小drawpole_3()    #畫漢諾塔的底座n=int(input("請輸入漢諾塔的層數并回車:"))#輸入漢諾塔的盤子數plates=creat_plates(n)#制造n個盤子poles=pole_stack()for i in range(n):poles[0].push(i)moveTower(plates,poles,n,0,2,1)myscreen.exitonclick()

  

? ? ? ? (2) 有圖有真相

?

轉載于:https://www.cnblogs.com/elbow/p/10604736.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449440.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449440.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Base62x比Base64的編碼速度更快嗎?

現在幾乎所有企事業單位、政府機構、軍工系統等的IT生產系統都會用到Base64編碼,從RSA安全密鑰到管理信息系統登錄入口回跳,目前越來越多的IT系統研發者開始使用 Base62x 替換 Base64. -Base62x 提供了一種無符號輸出的Base64的編碼方案,在許…

對Docker常用命令的整理

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 查看docker版本信息、 #docker version #docker -v #docker info image鏡像操作命令 #docker search image_name //檢索image #docker p…

再說千遍萬遍,都不如這四句話管用,不服不行!

一、健康是最大的利益    人有時候,真不知要謀求什么?往往把最值得維護和珍貴的東西忽視了,卻不知揀了芝麻丟了西瓜。   現在好多人都在透支健康,燃燒生命,經常借口工作忙、應酬多,不注意生活方式&…

error: failed to push some refs to 'https://gitee.com/xxx/xxx'

一開始以為是本地版本和線上的差異 果斷先直接pull 之后 還是不對,哎 不瞎搞了 搜... 獲得消息: git pull --rebase origin master 原來如此:是缺失了文件 轉載于:https://www.cnblogs.com/G921123/p/10605956.html

真格量化-歷史波動率

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np #日線級別 #開始時間,用于初始化一些參數 def OnStart(context):print("I\m starting...")#設定一個全局變量品種,本策略交易50ETF期權g.code = "…

DevOps團隊結構類型匯總:總有一款適合你

前言 組織中任何DevOps工作的主要目標都是改進客戶和業務的價值交付,而不是降低成本、提升自動化或者通過配置管理驅動一切;這意味著,為了實現有效的Dev和Ops協同,不同的組織可能需要不同的團隊結構。 概述 具體哪種DevOps團隊結構…

magic

轉載于:https://www.cnblogs.com/P201821430028/p/10611080.html

真格量化-bs套利

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np from copy import *#開始時間,用于初始化一些參數 def OnStart(context) :context.myacc = None#登錄交易賬號if context.accounts["回測期權"].Login…

人生歷練必備的十個心態(圖)

成功源自心態,如果為自己鑲嵌上雄心、信心、決心、愛心、專心、誠心、耐心、恒心、虛心、靜心這十顆心,不斷打造自己的心態,你就一定會取得人生的成功! 第一個:雄心 你應該讓自己試著從人生的地平線上躍起。 第二個&#xf…

【docker】常用docker命令,及一些坑

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 查看容器的root用戶密碼 docker logs <容器名orID> 2>&1 | grep ^User: | tail -n1因為docker容器啟動時的root用戶的密碼…

kubernetes系列10—存儲卷詳解

kubernetes系列10—存儲卷詳解 1、認識存儲卷 1.1 背景 默認情況下容器中的磁盤文件是非持久化的&#xff0c;容器中的磁盤的生命周期是短暫的&#xff0c;這就帶來了一系列的問題&#xff1a;第一&#xff0c;當一個容器損壞之后&#xff0c;kubelet 會重啟這個容器&#xff0…

真格量化-隱含波動率計算

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np from copy import *#開始時間,用于初始化一些參數 def OnStart(context) :context.myacc = None#登錄交易賬號if context.accounts["回測期權"].Login…

Vue 后臺管理

這里是結合vue和element快速成型的一個demo 里面展示了基本的后臺管理界面的大體結構和element的基本操作 GitHub的地址&#xff1a;https://github.com/wwwming/adminDemo 轉載于:https://www.cnblogs.com/wangming1002/p/10613014.html

生活竅門 這樣用錢就會富足

當我終于從惡劣處境中解脫之后&#xff0c;我想買棟房子&#xff0c;然而父親卻絲毫不為我感到興奮。他說&#xff1a;“在盡一項新的支付義務前&#xff0c;你應該多投資。”那個時候&#xff0c;許多人相信自己的房子是一種投資。我的父親問我&#xff1a;“如果你買了一棟房…

如何在Kubernetes集群動態使用 NAS 持久卷

1. 介紹&#xff1a; 本文介紹的動態生成NAS存儲卷的方案&#xff1a;在一個已有文件系統上&#xff0c;自動生成一個目錄&#xff0c;這個目錄定義為目標存儲卷&#xff1b; 鏡像地址&#xff1a;registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v1.11.5.4-43…

Linux查看MySQL版本的四種方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1 在終端下執行 mysql -V 2 在help中查找 mysql --help |grep Distrib 3 在mysql 里查看 select version() 4 在mysql 里查看 status…

行業指數動量策略+akshare

以周為單位&#xff0c;獲取本周最強的5只行業指數&#xff0c;進行均值購買。 數據源采用akshare。 導入包 import akshare as ak import pandas as pd import numpy as np import matplotlib 日線換為周線 #日線換為周線數據 def transferToWeekLine(df):data1dfstock_da…

2019-03-28 SQL Server Pivot

--現在我們是用PIVOT函數將列[WEEK]的行值轉換為列&#xff0c;并使用聚合函數Count(TotalPrice)來統計每一個Week列在轉換前有多少行數據&#xff0c;語句如下所示 select * from ShoppingCart as C PIVOT(count(TotalPrice) FOR [Week] IN([1],[2],[3],[4],[5],[6],[7])) AS…

C/C++開發者必不可少的15款編譯器+IDE

摘要&#xff1a;C/C這兩門語言依然活躍在編程領域里&#xff0c;其不僅擁有強大的功能集&#xff0c;而且還提供了強大的安全保障。為此&#xff0c;筆者專為C/C編碼者收集了15款令人印象深刻的IDE和編譯器。 Web開發者可選擇的編程語言有很多比如&#xff0c;Java、.Net、PH…

白山云科技 CTO 童劍:空降后,如何有技術又有藝術地破局?

TGO 鯤鵬會北京分會舉行了一場線下分享活動——《 CTO 空降如何平穩落地 》&#xff0c;白山云科技&#xff08;下稱“白山”&#xff09;CTO 童劍分享了他的故事和經驗。在工作中&#xff0c;“空降”這個問題不僅僅是 CTO 會遇到&#xff0c;每一個帶團隊的領導都會遇到。如何…