本题需要考虑的是:有多少个连通块以及有多少个岛屿会被淹没。
可以使用bfs来寻找连通块的数量,然后用total记录岛屿上总的块的数量,并且用bound来记录与海相连的块的数量
如果total == bound 那么这个岛屿就会被淹没。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define x first
#define y second
using namespace std;
const int N = 1010;
typedef pair<int,int> PII;
char g[N][N];
bool st[N][N];
int n;
PII q[N * N];
int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};
void bfs(int sx,int sy,int &total,int &bound)
{
int hh = 0,tt = 0;
q[hh] = {sx,sy};//起点入队
st[sx][sy] = true;//起点访问过了
while(hh <= tt)
{
PII t = q[hh++];
total ++;
bool is_bound = false;//判断这个块是否与海相连
for(int i = 0; i < 4;i++)
{
int x = t.x + dx[i];
int y = t.y + dy[i];
if(x < 0 || y < 0 || x >= n || y >= n) continue;
if(st[x][y]) continue;
if(g[x][y] == '.')
{
is_bound = true;
continue;
}
q[++tt] = {x,y};
st[x][y] = true;
}
if(is_bound) bound++;
}
}
int main()
{
scanf("%d",&n);
for(int i = 0; i < n;i++) scanf("%s",g[i]);
int cnt = 0;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
if(!st[i][j] && g[i][j] == '#')//如果这个点没有被访问并且这个是岛屿上面的块
{
int total = 0,bound = 0;//total代表岛屿上所有块的数量,bound代表岛屿上与海相连的块的数量
bfs(i,j,total,bound);
if(total == bound) cnt++;//如果所有的块都等于与海相连的数量,那么这个岛屿就会被淹没
}
}
}
printf("%d\n",cnt);
return 0;
}
下面是用queue的写法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define x first
#define y second
using namespace std;
const int N = 1010;
int n;
char g[N][N];
int st[N][N];
typedef pair<int,int> PII;
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
void bfs(int sx,int sy,int &total,int &bound)
{
queue<PII> q;
q.push({sx,sy});
st[sx][sy] = true;
while(q.size())
{
PII t = q.front();
q.pop();
total++;
bool is_bound = false;
for(int i = 0;i < 4;i++)
{
int x = t.x + dx[i];
int y = t.y + dy[i];
if(x < 0 || y < 0 || x >= n || y >= n) continue;
if(st[x][y]) continue;
if(g[x][y] == '.')
{
is_bound = true;
continue;
}
q.push({x,y});
st[x][y] = true;
}
if(is_bound) bound++;
}
}
int main()
{
scanf("%d",&n);
for(int i = 0;i < n;i++) scanf("%s",g[i]);
int cnt = 0;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
if(!st[i][j] && g[i][j] == '#')
{
int total = 0,bound = 0;
bfs(i,j,total,bound);
if(total == bound)
{
cnt++;
}
}
}
}
cout << cnt << endl;
return 0;
}