深度優先搜尋 DFS

2021-10-09 07:05:34 字數 4115 閱讀 6104

作為搜尋演算法的一種,dfs對於尋找乙個解的np(包括npc)問題作用很大。但是,搜尋演算法畢竟是時間複雜度是o(n!)的階乘級演算法,它的效率非常低,在資料規模變大時,這種演算法就顯得力不從心了。當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源節點並重複以上過程,整個程序反覆進行直到所有節點都被訪問為止。屬於盲目搜尋。

總結來說就是,這個演算法運用的時候就是找乙個頭結點,然後沿著這個頭結點一直找下去,直到走到最後乙個滿足條件的分節點,然後再尋找另一條路徑,當沿著一條路走不滿足條件時會自動的跳入上一層節點進行判斷。dfs演算法通常與回溯演算法一起使用。

void

dfs(主要控制引數)

}

#include

using

namespace std;

int a[

100]=;

//用於存放待存入的數

int vis[

100]=;

int n;

void

dfs(

int step)

for(

int i=

1;i<=n;i++)}

}int

main()

題目:某人掉進了乙個迷宮裡面,請你告訴他是否有機會逃出去,第一上輸入兩個整數n和m表示乙個n×m的迷宮。接下來的輸入乙個n行m列的迷宮。其中『s』表示該人的起始位置,『*』表示牆,無法通過,』.'表示路,可以通過,『t』表示迷宮的出口,如果可以逃出去輸出yes,否則輸出no。

1<=m,n<=10;

輸入格式:

3 4

s**.

…***t

輸出格式:

yes

#include

using

namespace std;

char a[50]

[50];

int vis[50]

[50];

int flag=0;

int dir[4]

[2]=

;int m,n;

int q,p;

void

dfs(

int x,

int y)

for(

int i=

0;i<=

3;i++)}

}int

main()

}}dfs(p,q);if

(flag==1)

else

if(flag==0)

}return0;

}

題目:某人掉進了乙個迷宮裡面,請你告訴他是否有機會逃出去,第一上輸入兩個整數n和m表示乙個n×m的迷宮。接下來的輸入乙個n行m列的迷宮。其中『s』表示該人的起始位置,『*』表示牆,無法通過,』.'表示路,可以通過,『t』表示迷宮的出口,如果可以逃出去輸出逃出去的最少步數step,若不能輸出-1

#include

using

namespace std;

char a[50]

[50];

int vis[50]

[50];

int flag=0;

int dir[4]

[2]=

;int m,n;

int q,p;

int ans=

9999999999

;void

dfs(

int x,

int y,

int step)

if(a[x]

[y]==

't')

return;}

for(

int i=

0;i<=

3;i++)}

}int

main()

}}dfs(p,q,0)

;if(flag==1)

else

if(flag==0)

return0;

}

題目:蒜廠有一間長方形的房子,地面上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。

請寫乙個程式,計算你總共能夠到達多少塊黑瓷磚。

輸入格式:第一行是兩個整數w和h,分別表示x方向和y方向瓷磚的數量。w和h都超不過20。

在接下來的h行中,每行包括w個字元。每個字元表示一塊瓷磚的顏色,規則如下

1)』.』:黑色的瓷磚

2)』#『:白色的瓷磚

3)』@『:黑色的瓷磚,並且你站在這塊瓷磚上。該字元在每個資料集合 中唯一出現一次。

輸出格式:輸出一行,顯示從起始位置出發能到達的瓷磚數(計數時包括起始位置)

#include

using

namespace std;

char a[50]

[50];

int vis[50]

[50];

int dir[4]

[2]=

;int w,h;

int q,p;

int ans;

void

dfs(

int x,

int y)}}

intmain()

}}dfs(p,q)

; cout << ans << endl;

}return0;

}

假設 一張地圖 n行m列 ,0表示通暢1表示障礙物,p,q表示終點座標.求點(0,0)到(p,q)最短路徑

輸入:

p qm n

地圖輸出:

路徑最短步數

#include

using

namespace std;

int ans=

99999999999

;int a[50]

[50]=

;//地圖

int temp[50]

[50]=

;//判斷是否已經走過了

int p,q;

//終止位置

int m,n;

//大小

int dir[4]

[2]=

,,,}

;//向哪個方向走

void

dfs(

int x,

int y,

int step)

return;}

for(

int i=

0;i<

4;i++)}

}int

main()

}dfs(0

,0,0

);cout << ans << endl;

return0;

}

詳情

該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

#include

using

namespace std;

int place[8]

=;int d1[15]

;int d2[15]

;memset

(d1,1,

sizeof

(d1));

memset

(d2,1,

sizeof

(d2));

int flag[8]

;memset

(flag,1,

sizeof

(flag));

int nums=0;

void

dfs(

int n)

int col;

for(col=

0;col<

8;col++)}

}int

main()

深度優先搜尋DFS

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

深度優先搜尋 DFS

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

深度優先搜尋(dfs)

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