深度優先演算法的兄弟,包含另外一種搜尋思維
也叫寬度優先演算法
與深度優先演算法不同,廣度優先演算法注重於"對所有情況的分析搜尋"
如果是深度優先演算法是刨根問底地分析每種情況,
廣度優先就是在在層層擴充套件中找到題解
還是之前的問題,我們想在n*m的迷宮中找到起點到終點的最短路徑
我們的核心思想是分析擴充套件時每發現乙個點,就將這個點加入到佇列中,直到到達終點
另外,為防止乙個點被多次走到,我們還要乙個陣列來記錄乙個點是否被走到
我們決定使用乙個佇列來模擬搜尋過程,我們需要:
1.兩個引數x,y代表點座標
2.乙個引數s代表我們走過的步數
3.某一點之前的父,用於計算路徑 (本題不需要計算路徑,就省去這部分)
實現如下:
struct note ;
我們設定相關資料完成佇列,並且對各個條件進行初始化
struct node que[2501] ; //地圖為50*50,設定為2501就不會越界了
int head,tail ;
int a[51][51] = ; //用於儲存地圖
int book[51][51] = ; //記錄拿一些點已經在佇列中了,防止點的重複擴充套件
//0代表還沒走過
//設定佇列
head = 1 ;
tail = 1 ;
//先將預設起點(1,1)加入
que[tail].x = 1 ;
que[tail].y = 1 ;
que[tail].s = 0 ;
tail++;
book[1][1] = 1 ;
我們以(1,1) -> (1,2)為例解釋怎麼進行點的判斷
1.嘗試走到(1,2)
tx = que[head].x + 0;
ty = que[head].y + 1;
2.判斷
主要是兩點,一是是否越界,二是是否為障礙,三是是否已經走過
if(tx<1 || tx>n || ty<1 || ty >m)
if(a[tx][ty] == 0 && book[tx][ty])
if(a[tx][ty] == 0 && book[tx][ty] == 0 )
我們再用相同的做法判斷(2,1),至此我們已經搜尋了(1,1)周圍的所有點
現在我們需要更新(1,1),這個點已經沒用了,我們將它出隊
head++;
之後,我們新的出發點就變成了(1,2),對它進行搜尋,然後再更新,再搜尋...直到到達終點
另外,這裡的按四個方向搜尋的辦法和深度是一樣的
int next[4][2] = ,,,};
#includestruct note ;
int main() , book[51][51] = ;
//定義乙個用於表示方向的陣列
int next[4][2] = , //向右
, //向下
, //向左
//向上
};int head,tail ;
int i,j,k,n,m,startx,starty,p,q,tx,ty,flag ;
//讀入引數
scanf("%d %d",&n,&m) ;
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
scanf("%d %d %d %d",&startx,,&starty,&p,&q);
//初始化佇列
head = 1 ;
tali = 1 ;
//往佇列插入迷宮入口座標
que[tail].x = startx ;
que[tail].y = statty ;
que[tail].f = 0 ;
que[tail].s = 0 ;
tail++;
book[startx][starty] = 1 ;
flag = 0 ; //0表示還沒到達,1表示到達終點
//當佇列不為空的時候執行迴圈
//為什麼是「不為空」時執行,請看後面的**
while(head < tail)
if(tx == p && ty == q)
}if(flag ==1)
break ;
head++ ; //乙個點拓展結束後,對後面的點再拓展
}//列印步數
//值得注意的是,tail是指向「最後乙個位置的下乙個位置」,因此我們要-1
printf("%d",que[tail-1].s);
getchar();getchar();
return 0 ;
}
BFS廣度優先搜尋
廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...
bfs廣度優先搜尋
這一課我們來學習圖的另一種遍歷方法 廣度優先搜尋 breadth first search,簡稱 bfs 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...
廣度優先搜尋bfs
bfs即廣度優先搜尋演算法,其是搜尋演算法中的一種。1.dfs常用於尋找是否存在解 其從a節點出發,選取乙個臨近點b,然後不斷深入,在搜尋完b的下屬節點 ehif 後,回到a再搜尋臨近a的c節點,以此類推。2.bfs則用於在最短的時間或最少的移動距離內找到解 其往往從a節點出發,搜尋周圍所有的圍繞節...