搜尋演算法 DFS BFS(簡單介紹)

2021-09-20 12:46:33 字數 2323 閱讀 3507

一般步驟

(1) 把初始狀態放入陣列中,設為當前狀態;

(2) 擴充套件當前的狀態,產生乙個新的狀態放入陣列中,同時把新產生的狀態設為當前狀態;

(3) 判斷當前狀態是否和前面的重複,如果重複則回到上乙個狀態,產生它的另一狀態;

(4) 判斷當前狀態是否為目標狀態,如果是目標,則找到乙個解答,結束演算法。

(5) 如果陣列為空,說明無解。

//層數固定的情況

void

dfs(

int k)

else}}

}

經典問題

描述給定整數a1、

a2、.

....

..an

a_、a_、.......a_

a1​、a2

​、..

....

.an​

,判斷是否可以從中選出若干數,使它們的和恰好為k。

輸入首先,n

nn和k

kk,n

nn表示數的個數,k

kk表示數的和。 接著一行n

nn個數。

(1

<=n

<=20

1<=n<=20

1<=n

<=2

0,保證不超int

intin

t範圍)

輸出如果和恰好可以為k

kk,輸出「yes」,否則「no」

樣例輸入

4 13

1 2 4 7

樣例輸出

yes
#include 

#define maxn 10005

int a[maxn]

, n, k;

bool dfs

(int k,

int sum)

intmain()

求全排列
void

swap

(int

&a,int

&b)void

perm

(int list,

int low,

int high)

else

}}

類似於樹的按層次遍歷的過程,一般用來求最短路徑最小操作等等

一般步驟

void

bfs(起始點)

for(遍歷所有x相鄰點)}}

隊列為空,廣搜結束;

}

描述

給定乙個n∗m

n*mn∗

m的迷宮,每一步可以向上下左右四個方向走動,求出從起點到終點所需的最小步數

(』#』,』.』,『s』,'g』分別表示牆壁,通道,起點和終點)

樣例輸入

#s######.#

......#..#

.#.##.##.#

.#........

##.##.####

....#....#

.#######.#

....#.....

.####.###.

....#...g#

樣例輸出

22
#include 

#include

#include

using namespace std;

const

int inf =

100000

;const

int max =

101;

typedef pair<

int,

int>

p;char map[max]

[max]

;int d[max]

[max]

;//表示起點到各個位置的最短距離

int sx, sy, gx, gy;

//表示起點和終點座標

int n, m;

int dx[4]

=;int dy[4]

=;bool check

(int x,

int y)

intbfs()

}}return d[gx]

[gy];}

intmain()

if(map[i]

[j]==

'g')}}

int res =

bfs();

cout<< res

}

簡單搜尋 DFS BFS

簡單搜尋 dfs bfs dfs 俗稱爆搜,為深度優先搜尋 bfs 俗稱廣搜,為寬度優先搜尋 假設當前有一棵解答樹 當然一般非標準樹形 dfs借助棧一路下通,直通到最後一層 即已算出乙個可行解 再退一層,看看在這一層還有沒有其他分支,有就繼續扎下去 重複這個過程 so,這就是所謂的 dfs可以解任何...

簡單搜尋 DFS BFS

1 dfs depth first search 深度優先搜尋演算法 是圖與樹搜尋中用到的一種演算法 遍歷的思想是 先從根部進行,一直遍歷到最底部的葉節點,然後再返回到根節點,判斷,如果該根節點上的葉節點都被遍歷過,再返回到根節點,直到遍歷到整棵樹。dfs遍歷循序 我們可以通過棧的思想來進行搜尋,a...

最簡單的搜尋演算法

目前自己用的比較多的是廣搜bfs 以下是別的大神們的詳細講解 原 bfs可用於解決2類問題 從a出發是否存在到達b的路徑 從a出發到達b的最短路徑 這個應該叫最少步驟合理 其思路為從圖上乙個節點出發,訪問先訪問其直接相連的子節點,若子節點不符合,再問其子節點的子節點,按級別順序依次訪問,直到訪問到目...