AcWing 1233. 全球变暖 bfs+判断
发布日期:2021-05-12 17:10:47 浏览次数:18 分类:精选文章

本文共 1954 字,大约阅读时间需要 6 分钟。

你有一张某海域 N×N 像素的照片,”.”表示海洋、”#”表示陆地,如下所示:

........##.....##........##...####....###........

其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 2 座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。

具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:

................................#................

请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

输入格式

第一行包含一个整数N。

以下 N 行 N 列,包含一个由字符”#”和”.”构成的 N×N 字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋。

照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。

输出格式

一个整数表示答案。

数据范围

1≤N≤1000
输入样例1:

7........##.....##........##...####....###........

输出样例1:

1

输入样例2:

9..........##.##....#####....##.##.............##.#.....#.###....#..#.............

输出样例2:

1

这道题类似于填充,我在[啊哈算法]中了解到遍历一个岛的每一个点就采用广搜的方式的去填充这个岛,这样就可以填充每一个点(表示一个岛),然后我们开始判断每个岛是否没淹没(即判断每个点是否都与海相邻,我们需要加一个check来判断是否与海相邻,最后输出所有点都被淹没的岛。

思路:

bfs+判断

代码如下:

#include
#include
#include
using namespace std;#define x first#define y secondtypedef pair
PII;int dx[]={ 0,0,1,-1},dy[]={ 1,-1,0,0};const int N=1010;char g[N][N];bool st[N][N];int n;bool check(int x,int y){ for(int i=0;i<4;i++) { int tx=x+dx[i]; int ty=y+dy[i]; if(tx<0||ty<0||tx>=n||ty>=n) continue; if(g[tx][ty]=='.') return false; } return true;}int bfs(int sx,int sy){ queue
q; st[sx][sy]=true; q.push({ sx,sy}); int z=0; while(q.size()) { auto t=q.front(); q.pop(); for(int i=0;i<4;i++) { int tx=t.x+dx[i]; int ty=t.y+dy[i]; if(tx<0||ty<0||tx>=n||ty>=n) continue; if(st[tx][ty]||g[tx][ty]=='.') continue; st[tx][ty]=true; if(check(tx,ty)) z++; q.push({ tx,ty}); } } if(z) return 0; else return 1;}int main(void){ scanf("%d",&n); for(int i=0;i
>g[i]; int res=0; for(int i=0;i

这道题也是一遍就过去样例了,可能样例比较松,我还是成功一遍过了,要坚持下去。

上一篇:AcWing 1246. 等差数列 最大公约数
下一篇:AcWing 1096. 地牢大师 多维bfs 学会思维上的推导

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月06日 01时41分58秒