訓練一 深度優先搜尋

2021-07-24 18:23:32 字數 1769 閱讀 5418

例1.  poj 1979 red and black

題意:由@為起點,周圍最多有『 . 』跟它相連通,不能越過『 # 』。@本身也算乙個

輸入輸出

sample input

6 9....#.

.....#

......

......

......

......

......

#@...#

.#..#.

11 9

.#.........

.#.#######.

.#.#.....#.

.#.#.###.#.

.#.#..@#.#.

.#.#####.#.

.#.......#.

.#########.

...........

11 6

..#..#..#..

..#..#..#..

..#..#..###

..#..#..#@.

..#..#..#..

..#..#..#..

7 7..#.#..

..#.#..

###.###

...@...

###.###

..#.#..

..#.#..

0 0sample output

4559613

**:

#include

using namespace std;

char map[25][25];

int n,m,num;

int i,j,ii,jj;

int dfs(int x,int y)

if(x<=n&&y<=m)

if(x-1>0&&map[x-1][y]!='#')

if(y+1<=m&&map[x][y+1]!='#')

if(y-1>0&&map[x][y-1]!='#') }

return 1;

}int main()}}

for(j=0;j<=n+1;j++)

for(j=0;j<=m+1;j++)

num=1;

map[ii][jj]='#';

dfs(ii,jj);

cout<

思路:以@為起點上下左右四個方向搜尋,到乙個點計數器加1,把『 . 』改為『 # 』。當走到四周都為『#』時,搜尋結束。

例二: hdu  1010  tempter of the bone

題意:

在一張地圖上,給定起點和終點,問能否恰好在t時刻到達終點

沒有過的**

過的**

思路:dfs+減枝,奇偶剪枝

第乙個剪枝我們可以想到,當剩下的步數大於剩下的時間的時候,狗是不能走到的;

接下來我們來第二個剪枝:

我們把map的奇偶性以01編號:

0 1 0 1 0 1 

1 0 1 0 1 0 

0 1 0 1 0 1 

1 0 1 0 1 0 

0 1 0 1 0 1 

我們發現從0走一步一定走到1,從1走一步一定走到0。

也就是說,如果當前的狗所在的座標與d的座標奇偶性不一樣,那麼狗需要走奇數步。

同理,如果狗所在座標與d的座標奇偶性一樣,那麼狗需要走偶數步數。

也就是說,狗的座標x、y和對2取餘是它的奇偶性,dxy和對2取余是d的奇偶性。

兩個奇偶性一加再對2取餘,拿這個餘數去與剩下時間對2取餘的餘數作比較即可。

深度優先搜尋(一)

深度優先搜尋 dfs 是一種基本的圖演算法,主要針對圖和樹,英文縮寫 dfs。走迷宮 深度優先搜尋的重要例子 走迷宮。用迷宮代替圖,通道代替邊,路口代替定點,那麼我們就可以將迷宮看成是乙個圖。要探索迷宮中的所有通道,我需要這樣做 和dfs思想是一樣的 圖例 題目 迷宮由n行m列的單元格組成,每個單元...

深度優先搜尋(一)

輸入n個數字,輸出這n個陣列的全排列。分析 首先需要乙個資料結構來確定還有哪些資料沒有被排序,因此有了bool陣列is in,然後有乙個陣列用來裝已經被排列的陣列,因此有了陣列bucket。結束條件是當選了n個數字以後,也就是沒有數字可以放入bucket的時候,結束深度優先搜尋。選擇列表就是剩餘未排...

廣度優先搜尋 深度優先搜尋

前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...