小罗写的bfs
你有一张某海域
NxN 像素的照片,".“表示海洋、”#"表示陆地,如下所示:
…
.##…
.##…
…##.
…####.
…###.
…
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
…
…
…
…
…#…
…
…
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
#include <bits/stdc++.h>
using namespace std;
const int N = 1010; char mp[N][N]; int flag; int vis[N][N];
int d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
//写一个bfs函数,里面有两个参数x,y,记录是否岛屿全部被淹没
void bfs(int x,int y){
queue<pair<int,int>> q;
q.push({x,y});
vis[x][y]=1;
while(q.size()){
pair<int,int> t = q.front();
int tx = t.first, ty = t.second;
q.pop();
if(mp[tx][ty+1]=='#' && mp[tx][ty-1]=='#' && mp[tx+1][ty]=='#' && mp[tx-1][ty]=='#' )
flag=1;
for(int i=0;i<4;i++){
int nx = tx + d[i][0], ny = ty + d[i][1];
if(mp[nx][ny]=='#' && vis[nx][ny]==0){
q.push({nx,ny}); vis[nx][ny]=1;
}
}
}
}
int main()
{
int n; cin>>n;
for(int i=0;i<n;i++) cin>>mp[i];
int ans = 0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
flag = 0;
if(mp[i][j]=='#' && vis[i][j]==0){
bfs(i,j);
if(flag==0) ans++;
}
}
}
cout<<ans<<endl;
return 0;
}