回溯算法(試探法)
在搜索嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。回溯法是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。
回溯算法解決問題的
- 針對所給問題,定義問題的解空間,它至少包含問題的一個(最優)解。
- 確定易於搜索的解空間結構,使得能用回溯法方便地搜索整個解空間 。
- 以深度優先的方式搜索解空間,並且在搜索過程中用剪枝函數避免無效搜索。
實例:
地上有一個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