链接
知识点
DFS
思路
依次搜索地图,当遇到陆地将一连通的一整块全部用dfs搜索出来,并用其他符号表示,对于每一层的状态空间,当陆地的四个方向没有水,就可以认为没有被淹没,即当四周全部是陆地才更新flag。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
int n;
int ans = 0; //表示经海平面上升后剩余的岛屿数
int res_ans = 0; //一开始所有的岛屿数
char MAP[N][N];
bool flag; //用来判断有没有遍历过
int cnt; //判断岛屿四周情况
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
bool pd(int tx,int ty){
if(MAP[tx][ty] == '#' && tx <= n && tx >= 1 && ty <=n && ty >= 1){
return true;
}
return false;
}
bool check(int cnt){
if(cnt == 4){
return true;
}
return false;
}
void dfs(int x, int y)
{
if(flag==false)
{
cnt = 0;
for (int i = 0; i < 4; i++)
{
int xt = x + dx[i];
int yt = y + dy[i];
if (MAP[xt][yt] != '.')
{
cnt++;
}
}
if (check(cnt)) //岛屿四周都没有海洋,那就不会淹没
{
flag=true;
ans++;
return;
}
}
MAP[x][y] = '*';
for (int i = 0; i < 4; i++)
{
int tx = x + dx[i];
int ty = y + dy[i];
if (pd(tx,ty))
{
dfs(tx, ty);
}
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
for(int j = 1;j <= n;j++){
cin >> MAP[i][j];
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (MAP[i][j] == '#')
{
res_ans++;
flag=false;
dfs(i, j);
}
}
}
cout << res_ans - ans << endl;
return 0;
}