演算法 漢諾塔 Python 版

2021-08-14 07:52:02 字數 2619 閱讀 4196

題目

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

除了最基本的之外,還有一題,給定乙個陣列,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

# 表示所有操作的總次數

defhanoi

(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)

defstep

(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

0if 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演算法 漢諾塔

漢諾塔 hanoi tower 又稱河內塔,源於印度乙個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著n片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動乙個圓...

漢諾塔演算法

最簡步驟 2的n次冪 1 為了實現 n個盤從 借助c 從a 移動到 b 思路如下 首先考慮極限當只有乙個盤的時候 只要 盤直接從 a b即可 那麼當有2個盤的時候就只要先把1號盤從a c 然後 把2號盤 a b 再 把 2好盤從 c b 那麼當有n個盤的時候你只要先把 n 1個 盤 借助 b 移動到...