返回题解分享
讨论 / 题解分享/ 帖子详情

岛屿个数(编程题) - 题解

  1. 先从(0,0)开始走八步将外围海水染成2,那么目标范围地图内的0一定为岛内海水;

  1. 将岛内海水(地图中的0全部变成陆地)即填海造陆;
  2. 统计岛的个数;

#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 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!