劍指offer 回溯法

2021-10-23 04:51:44 字數 2919 閱讀 8678

題目描述

請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意乙個格仔開始,每一步可以在矩陣中向左,向右,向上,向下移動乙個格仔。如果一條路徑經過了矩陣中的某乙個格仔,則該路徑不能再進入該格仔。例如

矩陣中包含一條字串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因為字串的第乙個字元b佔據了矩陣中的第一行第二個格仔之後,路徑不能再次進入該格仔。

# -*- coding:utf-8 -*-

class

solution

:def

__init__

(self)

: self.dict1 =

defhaspath

(self, matrix, rows, cols, path)

: x =

[list

(matrix[i*cols:

(i+1

)*cols]

)for i in

range

(rows)

]print

(x)for i in

range

(rows)

:for j in

range

(cols)

: self.dict1 =

if self.bfs(x, i, j, path)

:return

true

return

false

defbfs

(self, x, i, j, path):if

not(

0<= i <

len(x)

and0

<= j <

len(x[0]

)):return

false

if x[i]

[j]!= path[0]

:return

false

if(i, j)

in self.dict1:

return

false

self.dict1[

(i, j)]=

1ifnot path[1:

]:return

true

return self.bfs(x, i-

1, j, path[1:

])or \

self.bfs(x, i+

1, j, path[1:

])or \

self.bfs(x, i, j-

1, path[1:

])or \

self.bfs(x, i, j+

1, path[1:

])

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

class

solution

:def

__init__

(self)

: self.dict1 =

self.count =

0def

movingcount

(self, threshold, rows, cols)

:# write code here

matrix =[[

1for i in

range

(cols)

]for j in

range

(rows)

] self.dfs(matrix,0,

0, threshold)

return self.count

defdfs(self, x, i, j, threshold):if

not(

0<= i <

len(x)

and0

<= j <

len(x[0]

)):return

false

if self.get_sum(i, j)

> threshold:

return

false

if(i, j)

in self.dict1:

return

false

self.dict1[

(i, j)]=

1 self.count +=

1 self.dfs(x, i -

1, j, threshold)

or \

self.dfs(x, i +

1, j, threshold)

or \

self.dfs(x, i, j -

1, threshold)

or \

self.dfs(x, i, j +

1, threshold)

defget_sum

(self, i, j)

: sum1 =

0while i:

sum1 += i %

10 i = i /

10while j:

sum1 += j %

10 j = j /

10return sum1

劍指offer 回溯法

面試題12 矩陣中的路徑 上下左右遞迴,在看邊界條件 include includeusing namespace std 遞迴 bool haspathcore char m,int row,int col,int i,int j,const char str,int pathlen,bool v...

劍指offer 回溯法總結

面試題12 13是接連的兩道回溯法的題。先上定義 回溯法的基本行為是搜尋,搜尋過程使用剪枝函式來為了避免無效的搜尋。剪枝函式包括兩類 1.使用約束函式,剪去不滿足約束條件的路徑 2.使用限界函式,剪去不能得到最優解的路徑。回溯法說白了就是遞迴,遞迴法演算法簡潔且執行效率高,但是與之相應的就是遞迴法一...

劍指offer 學習筆記 回溯法

回溯法可以看成蠻力法的公升級版,它從解決問題的每一步的所有可能選項裡系統地選擇乙個可行的解決方案。回溯法適合由多個步驟組成的問題,並且每個步驟有多個選項。用回溯法解決的問題的所有選項可以用樹狀結構形象地表示,在某一步有n個可能的選項,那麼該步驟可以看做樹狀結構中的乙個節點,每個選項看成樹中節點連線線...