当前位置: 代码迷 >> 综合 >> AcWing 1233. 全球变暖 bfs+判断
  详细解决方案

AcWing 1233. 全球变暖 bfs+判断

热度:105   发布时间:2023-11-23 13:46:29.0

AcWing 1233. 全球变暖

你有一张某海域 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<iostream>
#include<algorithm>
#include<queue>using namespace std;#define x first
#define y secondtypedef pair<int,int> 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<PII> 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;elsereturn 1;
}
int main(void)
{
    scanf("%d",&n);for(int i=0;i<n;i++) cin>>g[i];int res=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++){
    if(g[i][j]=='#'&&!st[i][j]){
    int t=bfs(i,j);if(t)res++;}}cout<<res;
}

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