原题链接 来自蓝桥云课https://www.lanqiao.cn/problems/178/learning/
#include <bits/stdc++.h>
using namespace std;
int N;
int mp[1010][1010], vis[1010][1010] = {0}; // 地图 已访问
int ans = 0;
int st[1010] = {0}; // 当前序号岛屿留存面积
int wayx[5] = {0, 0, -1, 1}; // 方向
int wayy[5] = {1, -1, 0, 0};
void dfs(int x, int y, int k)
{
vis[x][y] = 1;
int x1, y1;
int flag = 1; // 周围是否只有陆地
for (int i = 0; i < 4; i++)
{
x1 = x+wayx[i];
y1 = y+wayy[i];
//printf ("\tser %d %d mp%d vis%d\n", x1, y1, mp[x1][y1], vis[x1][y1]);
if (mp[x1][y1] == 1) // 是陆地
{
if (vis[x1][y1] == 0)
{
//printf ("\tbfs1 %d %d\n", x1, y1);
dfs(x1, y1, k);
}
}
else flag = 0;
}
if (flag) st[k]++;
return ;
}
int work()
{
int i, j, t;
char c;
scanf("%d", &N); getchar();
for (i = 1; i <= N; i++)
{
for (j = 1; j <= N; j++)
{
scanf("%c", &c);
if (c == '#') mp[i][j] = 1;
}
if (i-N) getchar();
}
for (i = 1; i <= N; i++)
{
for (j = 1; j <= N; j++)
{
if (mp[i][j] == 1 && vis[i][j]==0)
{
//printf ("bfs0 %d %d\n", i, j);
dfs(i, j, ++ans);
}
}
}
N = ans;
ans = 0;
for (i = 1; i <= N; i++)
{
//printf ("%d ", st[i]);
if (st[i] == 0) ans ++;
}
printf ("%d", ans);
return 0;
}
int main()
{
int T = 1;
//scanf("%d", &T);
while (T--) work();
//getchar();getchar();getchar();
return 0;
}