思路:刚开始思路是统计 淹没前后岛屿数量相减 结果发现不对
因为可能原来是一个岛 然后淹没后成了更多的岛
所以我们只能判断淹没之前 该岛屿有没有一个点 四周都是陆地 即可
bfs
下面是AC代码
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
#define sd(a) scanf("%d",&a)
#define sdd(a,b) scanf("%d%d",&a,&b)
#define cl(a,b) memset(a,b,sizeof(a))
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define sddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define dbg() printf("aaa\n")
using namespace std;
int n;
char g[1010][1010];
bool con[1010][1010];
bool rec[1010][1010];//记录那些 四周都是#的地方
int dir[4][2]={0,1,1,0,-1,0,0,-1};
struct node{
int x,y;
};
bool judge(int x,int y){
if(g[x][y]=='.'||con[x][y]==true) return false;
return true;
}
bool bfs(int x,int y){
bool t=false;//默认会被淹没
queue<node> q;
while(!q.empty()) q.pop();
node tp;
con[x][y]=true;
tp.x=x;
tp.y=y;
q.push(tp);
while(!q.empty()){
tp=q.front();
q.pop();
int flag=0;
rep(i,0,3){
node tp1;
tp1.x=tp.x+dir[i][0];
tp1.y=tp.y+dir[i][1];
if(g[tp1.x][tp1.y]=='#'){
flag++;
}
if(!judge(tp1.x,tp1.y)) continue;
con[tp1.x][tp1.y]=true;
q.push(tp1);
}
if(flag==4) t=true;
}
return t;
}
int main() {
sd(n);
getchar();
rep(i,1,n){
scanf("%s",g[i]+1);
}
cl(con,0);
cl(rec,0);
int num=0;
rep(i,2,n-1){
rep(j,2,n-1){
if(g[i][j]=='#'&&!con[i][j]){
if(!bfs(i,j)){
num++;
}
}
}
}
printf("%d\n",num);
return 0;
}
/*
7
.......
.##....
.#####.
.##.##.
..####.
...###.
.......
*/
你有一张某海域NxN像素的照片,".“表示海洋、”#"表示陆地,如下所示:
…
.##…
.##…
…##.
…####.
…###.
…
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
…
…
…
…
…#…
…
…
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。
照片保证第1行、第1列、第N行、第N列的像素都是海洋。
输出
一个整数表示答案。
样例输入
7
…
.##…
.##…
…##.
…####.
…###.
…
样例输出
1