遞歸與動態規劃II-漢諾塔

題目描述

有一個int數組arr其中只含有一、2和3,分別表明全部圓盤目前的狀態,1表明左柱,2表明中柱,3表明右柱,arr[i]的值表明第i+1個圓盤的位置。好比,arr=[3,3,2,1],表明第1個圓盤在右柱上、第2個圓盤在右柱上、第3個圓盤在中柱上、第4個圓盤在左柱上。若是arr表明的狀態是最優移動軌跡過程當中出現的狀態,返回arr這種狀態是最優移動軌跡中的第幾個狀態。若是arr表明的狀態不是最優移動軌跡過程當中出現的狀態,則返回-1。數組

給定一個int數組arr及數組的大小n,含義如題所述,請返回一個int,表明所求的結果。app

測試樣例:
[3,3]
返回:3

解決思路:首先求出全部的狀態,而後在這個狀態集合中遍歷一遍找到arr相等的狀況。
step1: 若是隻有一個漢諾塔,那麼直接從左邊移動到右邊。
step2: 若是有2個漢諾塔,那麼首先把上面的移動到中間,而後下面的移動到右邊,最後再把中間的移動到右邊。
step3: 若是有n個漢諾塔,那麼能夠按照step2的思路,先將上面的n-1個移動到中間,而後最下面的移動到右邊,最後將中間的n-1個移動到右邊。
代碼實現以下
class Hanoi:
    def chkStep(self, arr, n):
        # write code here
        self.initStatus = [1]*n
        self.allStatus = [[1]*n]
        self.move(n,1,2,3)
        i = 0
        for s in self.allStatus:
            if s == arr:
                return i
            i = i+1
        return -1
    def move(self, n, left, mid, right):
        if n <= 0:
            return
        self.move(n-1, left, right, mid)
        self.change(n, right)
        self.move(n-1, mid, left, right)
    def change(self, n, right):
        self.initStatus[n-1] = right
        self.allStatus.append(self.initStatus[:])
相關文章
相關標籤/搜索