2021.11.17蓝桥杯考点BFS广度优先搜索
DFS代码短难理解,BFS代码长,易理解
最短路径是BFS的基本用途,但是只适用任意相邻两点之间距离相等,如果要查找一个起点到一个终点的最短距离,BFS是最优的算法,计算复杂度是O(n),n是图上点的数量。
DFS会找到一条线但不是最短的,BFS扩散两层就到终点,多个老鼠走迷宫
BFS与队列是天生一对,队列先进先出。在任何时刻队列中都只有相邻两层的点。
BFS能搜索到所有连通的点,当队列为空时搜索结束。
BFS是用逐层扩散来进行连通性判断,用队列来模拟逐层扩散。
#include <stdio.h>
#define N 1000
int Map[N][N], visit[N][N];
// 广度优先遍历周围的陆地
// 若有其中一块陆地四周皆为陆地则不会被淹没
// 反之则会被淹没 return 0
int bfs( int i, int j){
int flag = 0; //该陆地四周是否全为陆地
if(Map[i+1][j]&& Map[i][j+1] && Map[i-1][j] && Map[i][j-1])
flag=1;//如果四周都是陆地,则这块为高地不会淹没
if( Map[i+1][j] && visit[i+1][j]==0) visit[i+1][j]=1,flag+=bfs(i+1,j);
if( Map[i][j+1] && visit[i][j+1]==0) visit[i][j+1]=1,flag+=bfs(i,j+1);
if( Map[i-1][j] && visit[i-1][j]==0) visit[i-1][j]=1,flag+=bfs(i-1,j);
if( Map[i][j-1] && visit[i][j-1]==0) visit[i][j-1]=1,flag+=bfs(i,j-1);
//如果访问的这一点为陆地或者没有访问过,就置为1表示已经访问过,继续遍历下一个
return flag>0?1:0;
}
//求解给定地图上会被淹没的小岛数
int numofIslands( int n){
int num = 0; //记录会被淹没的小岛数
for( int i=0; i<n; i++)
{ for( int j=0; j<n; j++)
{ if( Map[i][j] && visit[i][j]==0) //如果访问过
{ num += 1-bfs( i, j);
//printf( "this is island\n");
}
} }
return num;
}
int main(){
int n=0; //输入后过滤之后的空格
scanf( "%d", &n);
getchar();
for( int i=0; i<n; i++)
{ getchar(); // get'\n'
for( int j=0; j<n; j++)
{ if( getchar()=='.')
Map[i][j]=0;
else
Map[i][j]=1;
}
}
printf( "%d", numofIslands(n));
return 0;
}
map判重,set判重