//記錄是否訪問過
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...