先dfs每个联通快,如果靠海就变成‘$’,如果不靠海就变成‘*’
解释一下为什么要这么做:
1 为什么dfs而不是bfs:因为dfs递归形式个人感觉比较好写。
2 为什么靠海不直接变成‘.’:因为修改是直接改在原数据上,而判断函数也是在原数据上判断,其实也可以再多存一张原数据的图,不过那样实在是太艰苦朴素了。
3 为什么不靠海也要变:为了区分是否已经处理过,防止dfs鬼打墙。
用一个bool类型fil记录这块陆地是否全部淹没,如果在dfs的过程中出现不靠海的点,则fil=false;
最后总的联通块数-没淹没的块数
虽然方法很垃圾,但是我也很垃圾啊哈哈。
#include<iostream>
using namespace std;
const int N=1004;
char a[N][N];
int n;
int dy[4]={1,0,-1,0},dx[4]={0,1,0,-1};
bool fil=true;
bool check(int y,int x)
{
for(int i=0;i<4;i++)
{
int p=y+dy[i],q=x+dx[i];
if(p>=0&&p<n&&q>=0&&q<n&&a[p][q]=='.')
return true;
}
return false;
}
void bfs(int y,int x)
{
if(x<0||y<0||x>=n||y>=n||a[y][x]!='#') return ;
if(check(y,x))
a[y][x]='$';
else
{a[y][x]='*';
fil=false;}
for(int i=0;i<4;i++)
{int p=y+dy[i],q=x+dx[i];
bfs(p,q);}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>> a[i][j];
int res=0,num=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(a[i][j]=='#')
{
fil=true;
bfs(i,j);
num++;
if(!fil) res++;
}
}
cout<<num-res;
return 0;
}
兄弟,建议改善下你的码风,看着太难受了
是的,过几天我自己都看不懂了啊哈哈