兩種相愛相殺的搜尋演算法(BFS DFS)

2021-09-11 02:14:29 字數 1279 閱讀 1024

dfs;

當知道初始和目標狀態的,用雙向bfs:

無權圖最好用bfs

不用重複如隊

ps: 我一開始也寫過,不過真心覺得他寫的好

1、對於初始狀態入隊,設定初始狀態為已訪問

2、如果佇列不為空時,出隊隊頭元素,否則跳到第5步

3、檢查出隊的元素是否為最終解,如果是則跳到第5步。

4、對於出隊的元素,檢查所有相鄰狀態,如果有效並且未訪問,則將

所有有效的相鄰狀態進行入隊,並且設定這些狀態為已訪問,然後

跳到第2步重複執行

5、檢查最後出隊的元素是否為最終解,如果是輸出結果,否則說明無解

通常用佇列(先進先出,fifo)實現

初始化佇列q;

q = ;標記s為已訪問;

while(q為非空)

所有與now 相連 並 且未被訪問的點進入佇列(沒被標記);

並標記now已訪問;

}題目描述

一矩形陣列由數字0到9組成,數字1到9代表細胞,細胞的定義為沿細胞數字上下左右若還是細胞數字則為同一細胞,求給定矩形陣列的細胞個數。(1<=m,n<=100)?

輸入輸出格式

輸入格式:

輸入:整數m,n(m行,n列)

矩陣輸出格式:

輸出:細胞的個數

/*4 10

0 2 3 4 5 0 0 0 6 7

1 0 3 4 5 6 0 5 0 0

2 0 4 5 6 0 0 6 7 1

0 0 0 0 0 0 0 0 8 9

*/

#include

#define maxn 100

int m,n,cnt =0;

char s[maxn]

;int a[maxn]

[maxn]

,vis[maxn]

[maxn]

;int q[maxn]

;int movex[5]

=;int movey[5]

=;void

bfs(

int x,

int y)}}

}}intmain()

}for

(int i =

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

}}printf

("%d"

,cnt)

;}

通常搜出組合方式,求最優解的時候,我們考慮用dfs

資料結構:系統棧;

兩種基本的搜尋

搜尋是個 暴力的 好東西,學一學還是很有必要滴 首先就是dfs了,這是個好東西 一般來說,它分為3個階段 遞迴 回溯 dfs dfs的過程就類似於走迷宮時死磕一條路,除非走到死胡同,不然一直走下去,並且它會把所有可走的路都走一遍,因此它的效率不高,所以我們通常會加一些優化。最常用的是剪枝和記憶化 剪...

組合的兩種遞迴演算法

組合就是從n個物品中任意選擇m個組成一組,下面兩種遞迴演算法都可以求出不同的組合,如果待選物品當中有重複的,比如說下面 中an new char 變成 an new char,這兩種演算法依然有效,只不過要加一步去重複。tip 如果給出的陣列元素不是數字,比如是a,b,c,d,可以直接用陣列下標來進...

快速冪的兩種演算法

快速冪是一種在o logn 的時間複雜度下求出冪的一種方法。第一種算方法就是對於乙個x n我們可以把n轉化成2進製的形式,如x 22 x 16 x 4 x 2 因為22 二進位制 10110 16 4 2 所以我們可以推到出來這種演算法,完整 如下 typedef long long ll ll m...