Flood Fill(二)

简介: AcWing 1106. 山峰和山谷

AcWing 1106. 山峰和山谷

本题链接:AcWing 1106. 山峰和山谷

本博客提供本题截图:

image.png

image.png

image.png

本题分析

本题bfs部分和第一个例题一致,都是八方向扩展,用两个for循环即可has_higer是用来判断是否有比这个山高的,有的话返回ture,low ++,has_lower用来判断是否有比这个山矮的,有的话返回true,high ++,注意我们在定义bfs传递值得时候,has_higer和has_lower传递的是地址,所以在bfs中修改这两个值在main中可以改变,我们也可以定义成全局变量,这样就不需要传递地址了


AC代码

#include <cstdio>
#include <map>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef pair <int, int> PII;
const int N = 1010, M = N * N;
int g[N][N];
bool st[N][N];
PII q[M];
int n;
void bfs(int x1, int y1, bool &has_higher, bool &has_lower)
{
    int hh = 0, tt = 0;
    q[0] = {x1, y1};
    st[x1][y1] = true;
    while (hh <= tt)
    {
        auto t = q[hh ++];
        for (int i = t.x - 1; i <= t.x + 1; i ++ ) 
            for (int j = t.y - 1; j <= t.y + 1; j ++ )
            {
                if (i == t.x && j == t.y) continue;
                if (i < 0 || i >= n || j < 0 || j >= n) continue;
                if (g[i][j] != g[t.x][t.y])
                {
                    if (g[i][j] > g[t.x][t.y]) has_higher = true;
                    if (g[i][j] < g[t.x][t.y]) has_lower = true;
                }
                else if (!st[i][j])
                {
                    q[++ tt] = {i, j};
                    st[i][j] = true;
                }
            }
    }
}
int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) 
        for (int j = 0; j < n; j ++ ) 
            scanf("%d", &g[i][j]);
    int high = 0, low = 0;
    for (int i = 0; i < n; i ++ ) 
        for (int j = 0; j < n; j ++ ) 
            if (!st[i][j])
            {
                bool has_higher = false, has_lower = false;
                bfs(i, j, has_higher, has_lower);
                if (!has_higher) high ++;
                if (!has_lower) low ++;
            }
    printf("%d %d\n", high, low);
    return 0;
}

三、时间复杂度

关于Flood Fill的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。



目录
相关文章
|
4天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
328 102
|
4天前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;
|
5天前
|
缓存 JavaScript 前端开发
JavaScript 的三种引入方法详解
在网页开发中,JavaScript 可通过内联、内部脚本和外部脚本三种方式引入 HTML 文件,各具适用场景。本文详解其用法并附完整示例代码,帮助开发者根据项目需求选择合适的方式,提升代码维护性与开发效率。
197 110
|
5天前
|
Android开发 开发者 Windows
这是我设计的一种不关机,然后改造操作系统的软件设计思路2.0版本
本文介绍了在不重启系统的情况下实现操作系统改造的两种方案。第一种方案通过SLFM Recovery模式,在独立于操作系统的最高权限环境下完成系统更新与改造,并支持断电恢复与失败回滚。第二种方案采用多分区机制,通过SLFM套件在独立分区中完成系统改造,适用于可中断与不可中断服务场景,确保系统更新过程的安全与稳定。
230 132