2018年蓝桥杯 C++ B组-----全球变暖

题目链接

题目大意:

n *n 像素的照片,     

.  是海洋   

# 是陆地

上下左右四个方向连在一起的一片陆地 是岛屿  然后岛屿边缘一个像素的范围会被海水严

淹没

问 有多少岛屿会被完全淹没

解题思路:

居然自己写出来了  有点震惊

我先用  dfs  把岛屿全部标记了出来

然后再用 set 去重 

代码如下:

#include<iostream>
#include<set>
using namespace std;
char a[1100][1100],mp[1100][1100];
int vis[1100][1100];
int d[4][2]={
   
   {-1,0},{1,0},{0,-1},{0,1}};
int n;
int ans=0;
void dfs(int x,int y)
{
	for(int i=0;i<4;i++)
	{
		int xx=x+d[i][0];
		int yy=y+d[i][1];
		if(xx>=0&&xx<n&&yy>=0&&yy<n&&mp[xx][yy]=='#')
		{
			vis[xx][yy]=ans;
			mp[xx][yy]='.';
			dfs(xx,yy);
		}
	}
}
int main()
{
	int i,j,k,x;
	int sum=0;
	int flag;
	cin>>n;
	for(i=0;i<n;i++)
	  for(j=0;j<n;j++)
	  {
	  	   cin>>mp[i][j];
	  	   a[i][j]=mp[i][j];
	  }
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(mp[i][j]=='#')
			{
				ans++;
				mp[i][j]='.';
				vis[i][j]=ans;
				dfs(i,j);	
			}
		}
	} 
	set <int> s;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			flag=0;
			if(a[i][j]=='#')
			{
				for(k=0;k<4;k++)
				{
					int xx=i+d[k][0];
					int yy=j+d[k][1];
					if(a[xx][yy]=='.')
					{
						flag=1;
						break;
					}
				}
				if(flag==0)
				{
					s.insert(vis[i][j]);
				}
			}
		}
	}
	cout<<ans-s.size()<<endl;
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_43819762/article/details/109016210