题目
题解
DFS。
比较基础,考查的是DFS判连通。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, idx;
string a[N];
int id[N][N]; // (i,j)属于第几块陆地
int vis[N][N]; // 判断(i,j)这块地是否已经被淹没
int dir[2][4] = {-1, 1, 0, 0, 0, 0, -1, 1};
set<int> s;
void dfs (int x, int y) {
for (int k = 0;k < 4;k ++) {
int tx = x + dir[0][k], ty = y + dir[1][k];
if (tx < 0 || tx >= n || ty < 0 || ty >= n) continue;
if (a[tx][ty] != '#' || id[tx][ty]) continue; // 如果不是陆地,或者是陆地但是被标上号了
id[tx][ty] = idx;
dfs (tx, ty);
}
}
int main()
{
cin >> n;
for (int i = 0;i < n;i ++)
cin >> a[i];
for (int i = 0;i < n;i ++)
for (int j = 0;j < n;j ++)
if (a[i][j] == '#' && !id[i][j]) { // 是陆地且未被标号
id[i][j] = ++ idx;
dfs (i, j);
}
for (int i = 0;i < n;i ++)
for (int j = 0;j < n;j ++)
if (a[i][j] == '.') { // 是海洋,向其四个方向淹没陆地
for (int k = 0;k < 4;k ++) {
int tx = i + dir[0][k], ty = j + dir[1][k];
if (tx < 0 || tx >= n || ty < 0 || ty >= n) continue;
if (a[tx][ty] == '#') vis[tx][ty] = 1; // 标记该陆地被淹没
}
}
for (int i = 0;i < n;i ++)
for (int j = 0;j < n;j ++)
if (a[i][j] == '#' && !vis[i][j]) // 如果这是陆地且未被淹没,则统计
s.insert (id[i][j]);
cout << idx - s.size () << endl;
return 0;
}