DFS深度優先搜尋練習

2021-09-23 20:54:09 字數 2466 閱讀 7796

題意:用@代表油田,八個方向互相連線,把相連的油田看作一塊油田,問你最多有多少塊油田。

思路:本題其實本質就是乙個迷宮問題,所以我們就可以用dfs或者bfs,本題我們當然採用dfs,用乙個vis標記一下,然後從頭開始遍歷,如果這個點等於『@』並且vis為0時,開始bfs一次,記錄bfs的次數,bfs的次數就是結果。

#include

using namespace std;

const

int maxn =

100;

char str[maxn]

[maxn]

;int vis[maxn]

[maxn]

, n, m;

int dx[10]

=;int dy[10]

=;int cnt =1;

void

dfs(

int x,

int y)

}int

main()

for(

int i =

0; i < n; i++)}

} cout<}return0;

}

題意:就是給你乙個棋盤形狀不規則,用:『#』代表棋盤,並且同一行或者同一列不能只能有乙個棋子,問你能有多少種方法。

思路:因為本題的資料非常的小,最大也就是10,但是它告訴你答案卻是非常的大,所以很容易想到dfs。如何dfs搜尋,我們dfs搜尋的使用用vis標記縱列,dfs搜尋橫列

**:

#include

#include

using namespace std;

const

int maxn =11;

char str[maxn]

[maxn]

;int vis[maxn]

;//標記縱列

int sum , n, m, num;

void

dfs(

int x)

if(x >= n)

return

;for

(int i =

0; i < n; i++)}

dfs(x+1)

;}intmain()

return0;

}

題意:在n*n的方格棋盤放置了n個皇后,使得它們不相互攻擊(即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。

你的任務是,對於給定的n,求出有多少種合法的放置方法。

思路:本題跟上面的題型差不多,只不過在搜尋的時候增加判斷語句,不允許處在與棋盤邊框成45角的斜線上,所以需要再增加乙個判斷。但是此題存在乙個問題就是是多組資料輸入,所以需要打表,因為就存在1~10中情況,所以需要預處理。

#include

using namespace std;

const

int maxn =11;

int vis[maxn]

, record[maxn]

;int res[maxn]

, ans, n;

bool check

(int x1,

int y1,

int x2,

int y2)

//判斷是否在棋盤邊框成45角的斜線上

void

dfs(

int pos)

//以橫座標深搜

int flag;

for(

int i =

0; i < n; i++)}

if(!flag)

//不再在棋盤邊框成45角的斜線上}}

}int

main()

while

(scanf

("%d"

,&n)

,n !=0)

return0;

}

**:

#include

#include

using namespace std;

const

int maxn =

100;

int vis[maxn]

[maxn]

, path[maxn]

[maxn]

;int dx[8]

=;int dy[8]

=;int p, q, flag =0;

;void

dfs(

int x,

int y,

int step)

for(

int i =

0; i <

8; i++)}

}int

main()

printf

("\n");

}if(t !=0)

printf

("\n");

}return0;

}

深度優先搜尋DFS

作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...

深度優先搜尋 DFS

深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...

深度優先搜尋(dfs)

深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...