AcWing 1233. 全球变暖
原题链接
简单
作者:
hxzz
,
2020-04-05 11:50:18
,
所有人可见
,
阅读 686
C++ 代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
constexpr size_t maxn = 1e3 + 5;
char mp[maxn][maxn];
int n, ans;
bool flag = 0;
bool vis[maxn][maxn];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
void dfs(int x, int y){
vis[x][y] = 1;
int t = 0;//用来记录当前的的点四周陆地的数量
for(int i = 0; i < 4; ++ i){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || nx >= n || ny < 0 || ny >= n) continue;
if(vis[nx][ny]){
t++;//如果搜过说明它这个方向也是陆地
continue;
}
if(mp[nx][ny] != '#') continue;
dfs(nx, ny);
t++;
}
if(t == 4 && !flag)//flag用来特判,因为一个连通块加上一次就行了,ans是不会被淹没的岛屿
flag = true, ans++;//这里不小心写错了
}
int main(){
cin >> n;
int cnt = 0;
for(int i = 0; i < n; ++ i)
scanf("%s", mp[i]);
for(int i = 0; i < n; ++ i)
for(int j = 0; j < n; ++ j)
if(mp[i][j] == '#' && !vis[i][j]) flag = 0,dfs(i, j), cnt ++;
cout << cnt - ans << endl;
return 0;
}