dfs 和遞迴的區別是,dfs 是一種演算法,注重的是思想,而遞迴是程式語言的一種寫法。我們通過遞迴的寫法來實現 dfs 。
下面我們通過乙個實際問題來理解 dfs 到底幹了什麼。
s##.
....
###t
其中's'表示起點,'t'表示終點,'#'表示牆壁,'.'表示平地。你需要從's'出發走到't',每次只能上下左右走動,並且不能走出地圖,也不能走進牆壁,每個點只能通過一次。現在要求你求出有多少種走的方案。
我們嘗試用 dfs 來求解這個問題。先找到起點,每個點按照左、下、右、上的順序嘗試,從起點's'開始,走到下乙個點以後,把這個點再當做起點's'繼續按照順序嘗試,如果某個點上下左右能走的點都嘗試走過了以後,便把起點回到走到這個點之前的點。繼續嘗試其他方向。直到所有點都嘗試走了上下左右。好比你自己去走這個迷宮,你也要乙個方向乙個方向的嘗試著走,如果這條路不行,就回頭,嘗試下一條路。
只不過現在由程式來完成這個過程。
下面給出了**的框架。
// 對座標為(x, y)的點進行搜尋
void dfs(int x, int y)
標記(x, y)已經訪問
for (x, y) 能到達的格仔(tx, ty)
}取消(x, y)訪問標記
}
對於這道題目,我們可以通過如下的方式,來根據格仔 (x,y)(x, y)(x,y) 求出可以到達的格仔 (tx,ty)(tx, ty)(tx,ty)。
int x, y;
int xx[8] = ; //橫向位移
int yy[8] = ; //縱向位移
for (int i = 0; i < 4; ++i)
題解如下:#includeusing namespace std;
int dx[8]=;
int dy[8]=;
int ans=0,aa[12][15]=;
char a[12][14];
void dfs(int x,int y,int n,int m)
else if(a[tx][ty]=='t')}}
aa[x][y]=0;
}int main()}}
dfs(x1,y1,n,m);
cout《現在你的邏輯是不是明了了許多呢?
希望你學好 dfs
謝謝。
計蒜客 基礎演算法入門之深度搜尋
很想寫乙個很好的文章引子,但是囿於語文水平有限,寫不出什麼好東西來,乾脆就隨便寫點東西吧。之前寫的文章都是關於爬蟲的,爬蟲雖好,但是寫來寫去就是那些東西,是時候學習點新東西了!現在自己很缺關於演算法的知識,於是就上計蒜客學習了基礎演算法入門,但是苦於它教學用的是c 而我大一學過c 現在早就忘光了。於...
計蒜客題目 Home Work
臨近開學了,大家都忙著收拾行李準備返校,但 i love c 卻不為此擔心 因為他的心思全在暑假作業上 目前為止還未開動。暑假作業是很多張試卷,我們這些從試卷裡爬出來的人都知道,卷子上的題目有選擇題 填空題 簡答題 證明題等。而做選擇題的好處就在於工作量很少,但又因為選擇題題目都普遍很長。如果有 5...
計蒜客題目 加一
陣列內存放了一些個位數字,組成乙個大數 從高位到低位 現在將這個數加 1,並輸出加一以後的結果。例如 a 2,3,1,1,4 則結果為 2,3,1,1,5 a 7,8,9 則結果為 7,9,0 第一行輸入乙個正整數 n 1 n 100 接下來的一行,輸入用空格分隔的 n 個 0 到 9 的非負整數組...