dfs 回溯 存在問題 矩陣中的路徑 拓撲排序

2021-10-10 06:49:27 字數 2486 閱讀 6469

//記錄是否訪問過

int dx[4]

=;int dy[4]

=;int ok=0;

bool dfs

(vector

char

>

>

& board,

int r,

int c,

int m,

int n,string word,

int index)

//index標記是第幾個字元

if(r<

0||r>=m||c<

0||c>=n)

//越界

if(vis[r]

[c]==

1||board[r]

[c]!=word[index]

) vis[r]

[c]=1;

//標記為已經訪問過

for(

int i=

0;i<

4;i++

)

vis[r]

[c]=0;

//還原,如果for迴圈中沒有返回,說明這個點不能走,退回

return false;

}bool exist

(vector

char

>

>

& board, string word)

vector<

int> tmp;

//初始化vis都沒有訪問過

for(

int j=

0;j) tmp.

push_back(0

);for(

int i=

0;i) vis.

push_back

(tmp)

;for

(int i=

0;i)//dfs

for(

int j=

0;j(dfs

(board,i,j,m,n,word,0)

)return true;

return false;

}這裡dfs存在回溯,就需要把標記陣列修改回去

int c[maxn]

;//標記是否正在進行dfs,=1表示已經

進行結束,=

0表示未進行,=

-1表示正在進行dfs

int topo[maxn]

;//topo[i]=u表示topo排序中第i個點是圖中下標為u的點

int g[maxn]

[maxn]

;bool dfs

(int u)

)return false;

//c[v]=-1,表示這個和u相鄰的點v已經在進行dfs了,說明g中有環(不然v不會在u之前進行dfs)

elseif(

!c[v]&&!

dfs(v)

)return false;

//c[v]=0,然後進行dfs(v),得到dfs(v)==false,說明還是有環

//注意這裡是沒有討論c[v]=1的情況的,已經進行完的不回成環}}

//迴圈結束,說明從u開始找到了一條topo

//因為如果沒有topo,那麼for迴圈不會正常結束,而是會在中間return false

c[u]=1

; topo[

--t]

=u;return true;

//說明從這一點開始,找到一條topo

}boo topo()

return true;

}

當用dfs判斷是否存在時候,可以讓dfs的返回值是bool型別

用到回溯的時候,記得需要在最後把標記陣列修改回去

拓撲排序中的c是標記陣列,但是拓撲排序不存在回溯,如果出現環,直接return false,for迴圈結束說明找到了乙個topo排序,所以標記陣列只需要修改為完成dfs狀態。

用dfs的時候先判斷是否需要回溯,這裡是不需要回溯的,只需要把每乙個可行解算出來即可

dfs+回溯:

void

dfs(

int r,

int m)

注意其中的修改vis標記,是讓在這個點繼續的dfs中不會重複遞迴回起始這個點

eg:dfs(1,1) 那麼遍歷相鄰點的時候,右邊的點被遍歷到dfs(1,2),在dfs(1,2)的時候(1,1)也是(1,2)的相鄰點,那麼此時因為(1,1)被標記過,就不會重複dfs了

把vis改回來,是當這個點開始的dfs都結束後,如果有從別的點遞迴到訪問這個點,還是允許的。比如從(0,1)點遍歷到(1,1)的時候,可能就可以dfs(1,1),因為在這個路徑中(1,1)還沒有被訪問過

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

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

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

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

回溯法 矩陣中的路徑問題(java)

package cn.csu.offers 矩陣中的路徑 author tiekai ba 2017年6月3日 public class offer 66 boolean visit new boolean rows cols 標記訪問過的矩陣座標位置,初始化為false for int i 0 i...