不同於由遞迴生成的深度優先搜尋,廣度優先搜尋(又叫寬度優先搜尋)使用的是「一層一層」擴充套件的方法。
問題1:解救人質
這裡使用乙個佇列來模擬搜尋的過程
struct note
;struct note que [2501];//地圖大小不超過50*50,因此佇列擴充套件不會超過2500個。
int head,tail;
佇列初始化:head = tail = 1
;將(1,1)加入佇列
que[tail].x = 1
;que[tail].y = 1
;que[tail].s = 0
;tail++;
首先對(1,1)擴充套件: 擴充套件出(1,2),(2,1)。
(1,1)擴充套件完畢後就沒用了,將它出隊。
head++
;
然後在(1,2),(2,1)的基礎上繼續向下探索。
(1,1)出隊後,佇列的head指到了(1,2),對該點擴充套件:(2,2)入隊。
(1,2)擴充套件完,沒用了,出隊。
head值到(2,1),對該點擴充套件:(2,2),(3,1)因為(2,2)已經在佇列中,所以只需要將(3,1)入隊。
輸入:
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
輸出:
7
#include
typedef struct
note;
note que[2501];
intnext[4][2] = ,,,};
int a[51][51],book[51][51];
int main()
if(nx == endx && ny == endy)
}if(flag == 1)
break;
head++;
}printf("%d\n",que[tail-1].s);
return
0;}
問題2:寶島探險
給了地圖,從(6,8)開始,地圖上不為0的為陸地,求陸地面積
從(6,8)開始搜尋,寬搜,不為0的加入佇列即可。
解救人質 BFS模板(迷宮問題)
和上個dfs的問題一樣,這次用bfs的思想,bfs沒有像dfs那樣專門有個step累加,是靠佇列思想實現,更像一群路徑競速,最快的到達後,就break輸出了 include struct node int main int book 51 51 定義乙個用於表示走的方向的陣列 int next 4 ...
解救小哈 BFS演算法舉例
有一天,小哈乙個人去玩迷宮。但是方向感不好的小哈很快就迷路了。小哼得知後便去解救無助的小哈。此時的小哼已經弄清楚了迷宮的地圖,現在小哼要以最快的速度去解救小哈。那麼,問題來了.輸入5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3 輸出輸入 3 3...
啊哈演算法 bfs 解救小哈
include struct note 定義乙個結構體佇列 int main book 51 51 a陣列存地圖,book標記那個點走過 int next 4 2 定義的方向 int head,tail 標記頭和尾 int i,j,k,n,m,startx,starty,endx,endy,tx,t...