- 先从(0,0)开始走八步将外围海水染成2,那么目标范围地图内的0一定为岛内海水;
- 将岛内海水(地图中的0全部变成陆地)即填海造陆;
- 统计岛的个数;
#include<bits/stdc++.h>
using namespace std;
struct dps{
int x;
int y;
};
char mp[55][55];
int m,n;
int dx[8]={-1,0,1,0,-1,1,1,-1};
int dy[8]={0,1,0,-1,1,1,-1,-1};
int ans[15];
void bfs1(dps a)
{
queue<dps> q;
q.push(a);
mp[a.x][a.y]='2';
while(!q.empty())
{
dps t=q.front();
q.pop();
for(int i=0;i<8;i++)
{
int tx=t.x+dx[i],ty=t.y+dy[i];
if(mp[tx][ty]=='0'&&tx>=0&&tx<=m+1&&ty>=0&&ty<=n+1)
{
dps temp;
temp.x=tx,temp.y=ty;
q.push(temp);
mp[tx][ty]='2';
}
}
}
return;
}
void bfs2(dps a)
{
queue<dps> q;
q.push(a);
mp[a.x][a.y]='2';
while(!q.empty())
{
dps t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int tx=t.x+dx[i],ty=t.y+dy[i];
if(mp[tx][ty]=='1'&&tx>=1&&tx<=m&&ty>=1&&ty<=n)
{
dps temp;
temp.x=tx,temp.y=ty;
q.push(temp);
mp[tx][ty]='2';
}
}
}
return;
}
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
for(int j=0;j<55;j++)//地图初始为'0'
for(int k=0;k<55;k++)
mp[j][k]='0';
cin>>m>>n;
for(int j=1;j<=m;j++)//输入mp
for(int k=1;k<=n;k++)
cin>>mp[j][k];
dps te;
te.x=0,te.y=0;
bfs1(te);//将外围海水标成2
for(int j=1;j<=m;j++)//将岛内海水变成土
for(int k=1;k<=n;k++)
{
if(mp[j][k]=='0')
mp[j][k]='1';
}
for(int j=1;j<=m;j++)//统计岛的个数
for(int k=1;k<=n;k++)
{
if(mp[j][k]=='1')
{
dps t={j,k};
bfs2(t);
ans[i]++;
}
}
}
for(int i=0;i<t;i++)
cout<<ans[i]<<endl;
return 0;}
0 回复
0 转发
0 喜欢
2 阅读



