问题描述
格式输入
格式输出
输出一个整数
样例输入
样例输出
1
评测用例规模与约定
- 最大运行时间:1s
- 最大运行内存: 256M
解析
采用dfs的方式进行搜索,首先输入地图之后进行搜索判断所有岛屿的数量,所有不会被淹没的岛屿的数量(因为只要有一块不和水相接就可以判断为是不会被淹没的所以才取它),然后相减即可得到被淹没的岛屿的数量。
参考程序
#include<bits/stdc++.h>
using namespace std;
int n;
const int N = 1e4+4;
char area[N][N];
bool flag;
int cnt;
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//往四个方向走
int ans=0;//没有被淹没岛屿的数量
int res=0;//岛屿的总数量
//用DFS判断搜到的这个岛屿会不会被淹没
void dfs(int x,int y)
{
if(flag==false){ //一个岛屿只要有一个点满足就不会变淹没了
cnt = 0;
for(int i=0; i<4; i++){
int tx=d[i][0]+x;
int ty=d[i][1]+y;
if(area[tx][ty]!='.')
cnt++;
}
if(cnt==4){//有一个点满足不会被淹没的条件
ans++;
flag=true;//这个岛屿不需要再遍历了
}
}
area[x][y]='*';//将遍历过的点变为 *,下一次就不会遍历了,所以不用标记数组
//注意这里不可以是‘.’因为上面if(area[tx][ty]!='.')cnt++
for(int i=0;i<4;i++){
int xx = x + d[i][0];
int yy = y + d[i][1];
if(area[xx][yy]=='#'&&x<N&&x>=0&&y<N&&y>=0)
dfs(xx,yy);
}
}
int main()
{
cin>>n;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>area[i][j];
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(area[i][j]=='#'){
res++;
flag=false;
dfs(i,j);
}
}
}
cout<<res-ans;
return 0;
}
以个人刷题整理为目的,如若侵权,请联系删除~