廣度優先搜索

      廣度優先搜索與前面的深度優先搜索是兩種特別常用圖的搜索算法,廣度優先搜索,是在搜索的把當前能到的點全部用隊列儲存起來,然後在進行隊列中下一個點的搜索,知道把圖搜索完成或達到了某個特定條件再結束。

看一道簡單例題:給定一張地圖,求裏面的連通塊個數

輸入:在第一行中輸入兩個整數 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); //打印連通塊個數
	
}

通過這道題可以對廣度優先搜索有一個大致的瞭解了----利用隊列 將當前位置所能到達的位置全部搜索。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章