廣度優先搜索與前面的深度優先搜索是兩種特別常用圖的搜索算法,廣度優先搜索,是在搜索的把當前能到的點全部用隊列儲存起來,然後在進行隊列中下一個點的搜索,知道把圖搜索完成或達到了某個特定條件再結束。
看一道簡單例題:給定一張地圖,求裏面的連通塊個數
輸入:在第一行中輸入兩個整數 r, c分別 表示地圖的寬度和長度,接下來 r 行 c 列 將地圖輸入。
輸出:在一行中輸出地圖的連通快個數。
看代碼:
#include<stdio.h>
int book[10][10]; //記錄是否搜索過
char mp[10][10]; //存儲地圖
struct map{ //利用結構隊列存儲#所在的座標
int x;
int y;
};
int next[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; //利用next二維數組實現 在#點上下左右搜索
int r,c;
void bfs(int x,int y,int cnt){
struct map queue[cnt];//將經過#的位置存儲在結構隊列中逐步搜索。
int head = 0,tail = 0,i,tx,ty;
queue[tail].x = x;
queue[tail++].y = y;
book[x][y] = 1;
while (head<tail){//直到一個連通塊搜索完畢再結束
for (i=0;i<4;i++){
tx = queue[head].x + next[i][0];
ty = queue[head].y + next[i][1];
if (tx<0||tx>=r||ty<0||ty>=c||book[tx][ty]==1||mp[tx][ty]=='*')
continue;
book[tx][ty] = 1;//記錄一下該連通塊搜索過了
queue[tail].x = tx;
queue[tail++].y = ty;
}
head++;
}
}
int main (){
int i,j,cnt = 0,count = 0;
struct map maps[100];
scanf("%d%d",&r,&c);
for (i=0;i<r;i++)
for (j=0;j<c;j++){
scanf(" %c",&mp[i][j]);
if (mp[i][j]=='#'){//記錄一下地圖中含有#位置的座標
maps[cnt].x = i;
maps[cnt].y = j;
cnt++; //記錄含有#的個數
}
}
for (i=0;i<cnt;i++){
if (book[maps[i].x][maps[i].y]==1) //當該位置未被標記時說明這是一個新的連通塊
continue;
count++;
bfs(maps[i].x,maps[i].y,cnt);
}
printf("%d\n",count); //打印連通塊個數
}
通過這道題可以對廣度優先搜索有一個大致的瞭解了----利用隊列 將當前位置所能到達的位置全部搜索。