#include <bits/stdc++.h>
using namespace std;
int seavis[55][55];//对bfs进行标记
int landvis[55][55];//对dfs进行标记
int island[55][55];//地图
int m,n;//m行,n列
int seadir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};//bfs方向
int landdir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//dfs方向
int ans=0;
struct node{
int y;
int x;
};
bool check(int y,int x){
if(y>=1&&y<=m&&x>=1&&x<=n)return true;
return false;
}
void dfs(int y,int x){//dfs找连在一起的岛屿
landvis[y][x]=1;
int dy,dx;
for(int i=0;i<4;i++){
dy=y+landdir[i][0];
dx=x+landdir[i][1];
if(check(dy,dx)&&landvis[dy][dx]==0&&island[dy][dx]){
dfs(dy,dx);
}
}
}
void bfs(int y,int x){//bfs找有多少个连在一起的岛屿
seavis[y][x]=1;
queue<node> q;
node start,next;
start.y=y;
start.x=x;
q.push(start);
while(!q.empty()){
start=q.front();
q.pop();
for(int i=0;i<8;i++){
next.y=start.y+seadir[i][0];
next.x=start.x+seadir[i][1];
if(check(next.y,next.x)&&!seavis[next.y][next.x]&&!island[next.y][next.x]){//遍历到海,入队继续bfs
seavis[next.y][next.x]=1;
q.push(next);
}
if(check(next.y,next.x)&&!landvis[next.y][next.x]&&island[next.y][next.x]){//遍历到陆地,进行dfs
ans++;
dfs(next.y,next.x);
}
}
}
}
int main()
{
int t;
cin>>t;
while(t--){
ans=0;
int flag=1;
memset(seavis,0,sizeof(seavis));
memset(landvis,0,sizeof(landvis));
cin>>m>>n;
for(int i=1;i<=m;i++){//地图赋值
string s;
cin>>s;
for(int j=0;j<n;j++){
island[i][j+1]=s[j]-'0';
}
}
for(int i=1;i<=m;i++){//找到所有地图最外圈的0
for(int j=1;j<=n;j++){
if(i==1||i==m||j==1||j==n){
if(!island[i][j]&&!seavis[i][j]){//被标记过就不用再搜
flag=0;
bfs(i,j);
}
}
}
}
if(flag)ans=1;
cout<<ans<<endl;
}
return 0;
}
蓝桥杯真题-岛屿个数
最新推荐文章于 2024-07-18 23:37:04 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)