dfs中防止重複訪問 回溯用到的兩種方法的區別

2021-09-29 07:27:12 字數 1062 閱讀 5957

防止所有層的重複訪問

通過visted[i]或者used[i]的置位和復位,標記

def

__dfs

(self, nums, visited, depth=

0, pre=

, output=

):if depth ==

len(nums)::

])return

for i in

range

(len

(nums)):

ifnot visited[i]

:# 置位visted[i]表示此刻訪問,下一層以下都不能訪問

visited[i]

=true

self.__dfs(nums, visited, depth +

1, pre +

[nums[i]

], output)

# 復位visted[i]

visited[i]

=false

return output

直接在當前層前設定 dp = dict(),以此標記當前層。

這種情況下,當前的dic被標記,進入下一層前,當前dic被壓入棧,下一層重新賦值為空{}, 從而保證了每一層不會重複訪問。

def

dfs(start, tmp)

: dic =

iflen

(tmp)

>1:

for i in

range

(start,

len(nums)):

if dic.get(nums[i],0

):continue

iflen

(tmp)==0

or nums[i]

>= tmp[-1

]:dic[nums[i]]=

1 dfs(i +

1, tmp +

[nums[i]

])

標頭檔案中防止重複定義的巨集

我是個有 潔癖 的人,不願意與警告為伍,哪怕是只有乙個,也會讓我渾身上下都不舒服。在一次整改乙個嵌入式arm工程源 的過程中,乙個編譯告警迷惑了我,費了我不少時間。waring c2207w inventing extern inituartpos main.c line 87 按理說不應該出現這種...

劍指offer 矩陣中的路徑(dfs,回溯)

請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意乙個格仔開始,每一步可以在矩陣中向左,向右,向上,向下移動乙個格仔。如果一條路徑經過了矩陣中的某乙個格仔,則該路徑不能再進入該格仔。例如 回溯法,思路如下 0.根據給定陣列,初始化乙個標誌位陣列,初始化為...

劍指Offer 矩陣中的路徑(dfs剪枝,回溯)

你不刷題,面試官就刷你。1 牛客和leetcode上面都有,方法傳入的引數不太一樣,但解法都一樣,自己沒想出來,做這類dfs的題目少,看了大佬們的解法,自己也能寫出來了。總結一下。寫的時候,我們要明確的知道,遞迴的終止條件,遞迴傳入的引數。這道題傳入的引數有矩陣 矩陣的行列座標n,m 題目要求的字串...