計蒜客深度優先搜尋基礎題目 走迷宮

2021-08-20 13:51:50 字數 1199 閱讀 5309

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 的非負整數組...