Python 回溯算法


回溯算法(試探法)

在搜索嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。回溯法是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。

回溯算法解決問題的

  • 針對所給問題,定義問題的解空間,它至少包含問題的一個(最優)解。
  • 確定易於搜索的解空間結構,使得能用回溯法方便地搜索整個解空間 。
  • 以深度優先的方式搜索解空間,並且在搜索過程中用剪枝函數避免無效搜索。

實例:

地上有一個m行和n列的方格。一個機器人從坐標0,0的格子開始移動,
每一次只能向左,右,上,下四個方向移動一格,
但是不能進入行坐標和列坐標的數位之和大於k的格子。
例如,當k為18時,機器人能夠進入方格(35,37),因為3+5+3+7 = 18。但是,它不能進入方格(35,38),因為3+5+3+8 = 19。請問該機器人能夠達到多少個格子?

class Solution:
    def movingCount(self, threshold, rows, cols):
        "產生 0 矩陣 "
        board=[[0 for i in range(cols)] for j in range(rows)]
        global acc
        acc = 0
        "下標之和,若大於threshold則TRUE,否則Folse"
        def block(r,c):
            s=sum(map(int,str(r)+str(c)))
            return s>threshold

        def traverse(r,c):
            global acc
            if not (0<=r<rows and 0<=c<cols):   # 超出角標范圍挑出
                return
            if board[r][c]!=0:    # 不等於0 跳出
                return
            if board[r][c]==-1 or block(r,c):
                board[r][c]=-1    #超出門限的點記錄-1
                return

            board[r][c]=1 #符合規定的點記錄1,並計數加一
            acc+=1
            traverse(r+1,c)
            traverse(r-1,c)
            traverse(r,c+1)
            traverse(r,c-1)

        traverse(0,0)
        return acc


o = Solution()
print(o.movingCount(4 ,3 ,3))

# 輸出結果:
9


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM