python漢諾塔程式設計 python實現漢諾塔演算法

2021-10-21 06:26:28 字數 2432 閱讀 7746

題目:漢諾塔給出最優解,如果對漢諾塔的定義有不了解,請翻看資料結構教材。

除了最基本的之外,還有一題,給定乙個陣列,arr=[2,3,1,2,3],其含義是這是乙個有5個圓盤的漢諾塔,每乙個數字代表這個圓盤所在的位置,1代表左邊的柱子,2代表中間,3代表右邊。給出這個序列代表了漢諾塔移動的第幾步,如果該步驟是錯誤的,則返回-1,所謂錯誤,是指該步驟不是最簡便的得到漢諾塔序列的操作步驟。

分析:1、 演算法當然還是遞迴解了,即把n個漢諾塔盤子分解成 n - 1 個盤子的移動和乙個底層盤子的移動,這樣一來,問題就成了一連串的遞迴,然後就可以逐步求解了。

當然了,漢諾塔還有高階問題,此處先不討論,隨後補上吧。

2、 這個步驟的迴圈是從最右邊開始的,考察最大的圓盤,因為陣列的索引值越大,其圓盤的半徑越大。

這樣一來,如果最大的圓盤的值為3,說明已經移動到位了,如果為1,說明還沒有開始移動底層圓盤,如果為2,說明圓盤移動到了中間,表示移動錯誤,因為根本不需要移動到中間,這個步驟是多餘的。

**:#!usr/bin/python2.7

# -*- coding=utf8 -*-

# @time : 18-1-3 下午9:52

# @author : cecil charlie

class hanoi(object):

漢諾塔問題,給定三個盤子,用計算機計算出來將所有的盤子從左移動到右的所有的操作。

def __init__(self):

self.place = ["left", "middle", "right"]

self.num = 0 # 表示所有操作的總次數

def hanoi(self, n):

給定乙個n,即漢諾塔的盤子數量,返回所有的從左移動到右側的具體操作步數

:param n: 盤子數

:return: 具體操作

self.num = 0

if n > 0:

self.__move(n, "left", "middle", "right")

def __move(self, n, start, mid, end):

if n == 1:

print "move from " + start + " to " + end

self.num += 1

else:

self.__move(n-1, start, end, mid)

self.__move(1, start, mid, end)

self.__move(n-1, mid, start, end)

def step(self, arr):

求解針對arr的圓盤,所對應的最優解到底是第幾步。解題的核心在於從右向左考察圓盤到底在不在3位置,如果在,則說明已經移動成功了;

如果在中間,說明移動出現了錯誤,因為不需要移動到中間,如果還在左邊,則仍需要考慮。

:param arr: 列表中每一項表示該項的圓盤在哪個柱子上,取值包括1,2,3。1表示左,2表示中,3表示右,索引值越大,表示的圓盤的半徑越大。

:return: 屬於最優解的第幾步

if arr is none:

return -1

for i in xrange(len(arr) - 1):

if arr[i] != 1 and arr[i] != 2 and arr[i] != 3:

return -1

return self.__process(arr, len(arr)-1, 1, 2, 3)

def __process(self, arr, i, start, mid, end):

具體操作得到arr屬於第幾步

:param arr: 圓盤對應的位置陣列列表

:param i: 考察arr圓盤的第幾個,最大值是 len(arr)-1

:return: 返回步數,如果給出的arr的位置不是移動的最優解,則返回 -1。

if i == -1:

return 0

if arr[i] != start and arr[i] != end:

return -1

if arr[i] == start:

return self.__process(arr, i-1, start, end, mid) # 說明其值還未過半,直接找之前的就好

else: # 說明步數已經過半了。

count = self.__process(arr, i-1, mid, start, end)

if count == -1:

return -1

return (i * 2) + count

h = hanoi()

h.hanoi(4)

print h.num

print h.step([3,3,2,1])

python 漢諾塔 Python漢諾塔

import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...

漢諾塔問題python詳解 《簡單分析》漢諾塔問題

漢諾塔是乙個非常著名的遊戲,遊戲中將會有三根棍子,第一根棍子上有n個從大到小疊起來的盤子,遊戲的目標是將這n個從大到小疊起來的盤子放到第三根棍子上。每一次只允許移動乙個,而且大的盤子永遠在小的盤子的下面。這也是非常著名的遞迴入門題。我們將通過呼叫三次遞迴函式來解決這個問題。暫時不考慮 只考慮解題。先...

Python實現漢諾塔

原始碼 move n,a,b,c 這個函式不要理解為abc三個柱子。請這樣理解,move函式,用來完成這麼乙個任務 把n個盤子,從 源柱 通過 過渡柱 移動到 目標柱 上。即move n,source,bridge,destination 為了完成這個任務,需要將此母任務分解為三個子任務 1.把 源...