KamaCoder 103. 水流问题

news2024/11/15 11:15:05

题目要求

N*M的矩阵,数值代表位置的相对高度。矩阵模拟了一个地形,当雨水落上时,会根据地形倾斜向低处流动。但是只能从较高或等高的地点流向较低或等高并且相邻的地点,我们的目标是确定那些单元格,从这些单元格出发的水滴既可以到达第一组边界,也可以到达第二组边界。

图中的蓝色方块上的雨水既能流向第一组边界,也能流向第二组边界。所以最终答案为所有蓝色方块的坐标。

思路

最基础的思路是遍历每一个节点,然后在每一个节点通过搜索判断是否能够到达两个边界。但是这种方法的时间复杂度是O(m^2 * n^2),显然是超时的。

优化思路

如果我们反过来想,从两个边界出发(逆流而上),把第一边界能够到达的位置和第二边界能够到达的位置都标记出来。然后两个方向都标记过的节点就是既能够到达第一边界也能够到达第二边界的节点。

#include<iostream>
#include<vector>
using namespace std;
int n, m;
int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};

// 从 x,y 出发,把可以走到的地方都标记上
void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y) {
    if (visited[x][y]) return;
    
    visited[x][y] = true;
    
    for (int i=0; i<4; ++i){
        int nextx = x + dir[i][0];
        int nexty = y + dir[i][1];
        if (nextx < 0 || nextx >= n || nexty < 0 || nexty >= m) continue;
        if (grid[x][y] > grid[nextx][nexty]) continue; // 注意:这里是从低向高遍历
        
        dfs(grid, visited, nextx, nexty);
    }
    return;
    
}

int main() {

    cin >> n >> m;
    vector<vector<int>> grid(n, vector<int>(m, 0));

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> grid[i][j];
        }
    }
    // 标记从第一组边界上的节点出发,可以遍历的节点
    vector<vector<bool>> firstBorder(n, vector<bool>(m, false));

    // 标记从第一组边界上的节点出发,可以遍历的节点
    vector<vector<bool>> secondBorder(n, vector<bool>(m, false));

    // 从最上和最下行的节点出发,向高处遍历
    for (int i = 0; i < n; i++) {
        dfs (grid, firstBorder, i, 0); // 遍历最左列,接触第一组边界
        dfs (grid, secondBorder, i, m - 1); // 遍历最右列,接触第二组边界
    }

    // 从最左和最右列的节点出发,向高处遍历
    for (int j = 0; j < m; j++) {
        dfs (grid, firstBorder, 0, j); // 遍历最上行,接触第一组边界
        dfs (grid, secondBorder, n - 1, j); // 遍历最下行,接触第二组边界
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            // 如果这个节点,从第一组边界和第二组边界出发都遍历过,就是结果
            if (firstBorder[i][j] && secondBorder[i][j]) cout << i << " " << j << endl;;
        }
    }


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[数据结构与算法·C++] 笔记 2.1 线性表

线性结构 概念 二元组 B ( K , R ) B(K,R) B(K,R) K a 0 , a 1 , . . . , a n − 1 K{a_0,a_1,...,a_{n-1}} Ka0​,a1​,...,an−1​ ( R r R{r} Rr) 有一个唯一的开始结点&#xff0c;它没有前驱&#xff0c;有一个唯一的直接后继一个唯一的终止结点&#xff0c;它有一个…

Diffusion Models/Score-based Generative Models背后的深度学习原理(7):估计配分函数

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;有不少订阅我专栏的读者问diffusion models很深奥读不懂&#xff0c;需要先看一些什么知识打下基础&#xff1f;虽然diffusion models是一个非常前沿的工作&#xff0c;但肯定不是凭空产生的&#xff0c;背…

【水文】LLM 成文测试|探索嵌入式硬件编程的奥秘:入门基础知识的全面解析

这次用的是智谱清言的&#xff0c;文字质量比百度的高一些。 但是在按要求改写的方面还是需要给出太过明确的指令&#xff0c;麻烦。 探索嵌入式硬件编程的奥秘&#xff1a;入门基础知识的全面解析 嵌入式硬件作为现代科技的核心&#xff0c;广泛应用于各种设备和系统中。对于…

【OSS安全最佳实践】对OSS内身份证图片中身份证号进行脱敏

为确保存储在私有OSS Bucket特定文件夹中包含中国内地身份证信息的PNG、JPG、JPEG、BMP或WEBP格式图片&#xff0c;在与其他用户共享时身份证信息不被泄露&#xff0c;可使用数据安全中心 DSC&#xff08;Data Security Center&#xff09;的图片脱敏功能。DSC目前仅支持对身份…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-22

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-22 引言: 全球最热销的国产游戏-《黑神话: 悟空》不仅给世界各地玩家们带来愉悦&#xff0c;而且对计算机人工智能研究也带来新的思考。在本期的论文速读中&#xff0c;我们带来一篇关于视觉语言模型&#xff0…

【C++高阶】深入理解C++ I/O流:标准库中的隐藏宝石

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C 特殊类 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ C IO流 &#x1f4d2;1. C语言的输入…

Linux中的动静态库

目录 前言 1.库的文件名 2.库的制作 对于动态库&#xff1a; 对于静态库&#xff1a; 3.库文件的查找 4.库的加载与使用 对于动态库&#xff1a; 对于静态库&#xff1a; 可执行程序分段&#xff1a; 程序的编址于动态库&#xff1a; 总结 前言 在刚开始学习C语言…

NASA:ASTER L1A 重建未处理仪器数据 V003

ASTER L1A 重建未处理仪器数据 V003 简介 先进星载热发射和反射辐射计&#xff08;ASTER&#xff09;1A 级&#xff08;AST_L1A&#xff09;包含重建的仪器数字编号&#xff08;DN&#xff09;&#xff0c;这些数字编号来自所获取的望远镜遥测数据流&#xff1a; 可见光和近红…

综合题第一题(地址表的填写)

题目 第一题的形式大概就是这样的&#xff0c;通常IP地址和子网掩码会给我们。 地址类别 补充知识 IP地址&#xff08;Internet Protocol Address&#xff09;是分配给网络中设备的数字标签&#xff0c;用于标识设备在网络中的位置。IP地址分为IPv4和IPv6两种版本&#xff0…

用Qt 对接‌百度AI平台

很多同学想利用几大模型AI弄点东西&#xff0c;但又不知道如何去介入&#xff1f;&#xff1f;最近帮同学弄点东西&#xff0c;刚好要接入到AI平台&#xff0c;就顺便研究了一下&#xff0c;并记录下来。 首先我们选择的 AI模型是百度的&#xff0c;然后注册&#xff0c;申请密…

vue实现数据栏无缝滚动实现方式-demo

效果 方式一 通过实现两个item 进行循环 <!--* Author: Jackie* Date: 2023-08-16 21:27:42* LastEditTime: 2023-08-16 21:41:51* LastEditors: Jackie* Description: scroll 水平滚动 - 效果基本满足需求* FilePath: /vue3-swiper-demo/src/components/scroll/Scroll12.…

开始场景的制作+气泡特效的添加

3D场景或2D场景的切换 1.新建项目时选择3D项目或2D项目 2.如下图操作&#xff1a; 开始前的固有流程 按照如下步骤进行操作&#xff0c;于步骤3中更改Company Name等属性&#xff1a; 本案例分辨率可以如下设置&#xff0c;有能力者可根据需要自行调整&#xff1a; 场景制作…

python是什么语言写的

Python是一种计算机程序设计语言。是一种面向对象的动态类型语言。现今Python语言很火&#xff0c;可有人提问&#xff0c;这么火的语言它的底层又是什么语言编写的呢&#xff1f; python是C语言编写的&#xff0c;它有很多包也是用C语言写的。 所以说&#xff0c;C语言还是很…

算法.图论-并查集

文章目录 1. 并查集介绍2. 并查集的实现2.1 实现逻辑2.2 isSameSet方法2.3 union方法(小挂大优化)2.4 find方法(路径压缩优化) 3. 并查集模板4. 并查集习题4.1 情侣牵手4.2 相似字符串组 1. 并查集介绍 定义&#xff1a; 并查集是一种树型的数据结构&#xff0c;用于处理一些不…

(学习记录)使用 STM32CubeMX——配置时钟(入门)

使用STM32CubeMX配置STM32F103C8T6时钟部分 选择芯片 ①&#xff1a;选择MCU型号 ①&#xff1a;这里使用英文输入法&#xff0c;输入你想要的芯片型号&#xff0c;我这里采用STM32F103C8T6 ②&#xff1a;这里能看到搜索后出来的芯片具体型号&#xff0c;选择匹配度最高的一个…

类和对象(2)(重点)

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 类的默认成员函数 概念概述 默认成员函数就是用户没有显式实现&#xff0c;编译器会自…

【CSS in Depth 2 精译_034】5.4 Grid 网格布局的显式网格与隐式网格(下)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

ACM MM24 | Hi3D: 3D生成领域再突破!新视角生成和高分辨率生成双SOTA(复旦智象等)

文章链接&#xff1a;https://arxiv.org/pdf/2409.07452 Github 链接&#xff1a;https://github.com/yanghb22-fdu/Hi3D-Official 亮点直击 本文提出了高分辨率图像到3D模型&#xff08;Hi3D&#xff09;&#xff0c;这是一种基于视频扩散的新范式&#xff0c;将单个图像重新定…

计算机毕业设计python+spark知识图谱房价预测系统 房源推荐系统 房源数据分析 房源可视化 房源大数据大屏 大数据毕业设计 机器学习

《PythonSpark知识图谱房价预测系统》开题报告 一、研究背景与意义 随着城市化进程的加速和房地产市场的不断发展&#xff0c;房价成为影响人们生活质量的重要因素之一。准确预测房价不仅有助于政府制定科学的房地产政策&#xff0c;还能为开发商提供市场参考&#xff0c;同时…

NLP-transformer学习:(7)evaluate实践

NLP-transformer学习&#xff1a;&#xff08;7&#xff09;evaluate 使用方法 打好基础&#xff0c;为了后面学习走得更远。 本章节是单独的 NLP-transformer学习 章节&#xff0c;主要实践了evaluate。同时&#xff0c;最近将学习代码传到&#xff1a;https://github.com/Mex…