蓝桥 - 全球变暖 BFS

思路:刚开始思路是统计 淹没前后岛屿数量相减 结果发现不对
因为可能原来是一个岛 然后淹没后成了更多的岛
所以我们只能判断淹没之前 该岛屿有没有一个点 四周都是陆地 即可
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

发布了120 篇原创文章 · 获赞 12 · 访问量 5252

猜你喜欢

转载自blog.csdn.net/weixin_43735161/article/details/105286822