【蓝桥杯每日一题】4.2 全球变暖

原题链接:1233. 全球变暖 - AcWing题库

由题意可知:

  • 需要找到淹没的岛屿的数量
  • 淹没的岛屿所具备的条件:咩有"高地",也就是说岛屿(连通块)中的所有元素的 4 4 4-邻域中均含有' . '

思路1:

将 t o t a l total total记录岛屿的全部元素数量, b o u n d bound bound记录岛屿的边界块数量,如果二者相等,则说明该岛屿会被淹没

dfs代码:

c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;

char a[N][N];
bool vis[N][N];
int n;
int res;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; //移动方向
bool flag=false; //插眼,看是否满足周围四个全是#

void dfs(int x,int y,int& total,int& bound) //total为联通块个数,bound为边界块个数
{
    vis[x][y]=1; //记录已经遍历过
    total++;
    bool is_bound=false;

    for(int i=0;i<4;i++)
    {
        int nx=x+dx[i];
        int ny=y+dy[i];
        //边界值的判断
        if(nx<0||ny<0||nx>=n||ny>n) continue;
        if(vis[nx][ny]) continue;

        if(a[nx][ny]=='.') {is_bound=true;continue;}
        dfs(nx,ny,total,bound);
    }
    if(is_bound) bound++;
    return;
}

int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++) cin>>a[i]; //cin处理字符串更为方便

    //遍历
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(a[i][j]=='#'&&!vis[i][j])
            {
                int total=0,bound=0;
                dfs(i,j,total,bound);
                if(total==bound) res++; //岛屿的块数全部为边界,则沉没
            }
        }
    }

    printf("%d",res);
    return 0;
}

思路2:

  • 直接搜索没有"高地"的连通块,用 f l a g flag flag值标记一下是否带有"高地"

bfs代码:

c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;

int n;
char a[N][N]; 
int vis[N][N]={0};  
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; //移动方向

int main()
{
    scanf("%d",&n);
    for(int i = 1; i <= n; i++) cin>>a[i]; //cin处理字符串更加方便
        
            
    int res = 0;
    
    //进行BFS
    for(int i = 1; i <= n; i++) 
	{
        for(int j = 1; j <= n; j++) 
		{
            if(a[i][j]=='#' && vis[i][j]==0) 
			{
                queue<pair<int, int>> q;
                q.push({i, j});
                vis[i][j] = 1;
                bool flag = true;

                while(!q.empty()) {
                    int x = q.front().first;
                    int y = q.front().second;
                    q.pop();

                    if(a[x][y+1]=='#' && a[x][y-1]=='#' && a[x+1][y]=='#' && a[x-1][y]=='#')
                        flag = false;

                    for(int k = 0; k < 4; k++) {
                        int nx = x + dx[k];
                        int ny = y + dy[k];

                        if(nx >= 1 && nx <= n && ny >= 1 && ny <= n && vis[nx][ny] == 0 && a[nx][ny] == '#') {
                            q.push({nx, ny});
                            vis[nx][ny] = 1;
                        }
                    }
                }

                if(flag)
                    res++; // 统计被淹没的岛的数量
            }
        }
    }

    printf("%d",res);
    return 0;
}
相关推荐
Jasmine_llq3 分钟前
《 火星人 》
算法·青少年编程·c#
闻缺陷则喜何志丹14 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
TENET信条24 分钟前
代码随想录 day52 第十一章 图论part03
图论
charlie11451419126 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
Lenyiin33 分钟前
01.02、判定是否互为字符重排
算法·leetcode
小林熬夜学编程37 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
倔强的石头1061 小时前
【C++指南】类和对象(九):内部类
开发语言·c++
鸽鸽程序猿1 小时前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript