題目:漢諾塔給出最優解,如果對漢諾塔的定義有不了解,請翻看資料結構教材。
除了最基本的之外,還有一題,給定乙個陣列,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.把 源...