代码随想录 103. 水流问题

news2024/10/8 14:45:18

103. 水流问题

#include<bits/stdc++.h>
using namespace std;

void dfs(vector<vector<int>>& mp, vector<vector<int>>& visit, int y, int x){
    if (visit[y][x] == 1) return;
    visit[y][x] = 1;
    if (y > 0){
        if (mp[y][x] <= mp[y - 1][x]){
            dfs(mp, visit, y - 1, x);
        }
    }
    if (x > 0){
        if (mp[y][x] <= mp[y][x - 1]){
            dfs(mp, visit, y, x - 1);
        }
    }
    if (y < mp.size() - 1){
        if (mp[y][x] <= mp[y + 1][x]){
            dfs(mp, visit, y + 1, x);
        }
    }
    if (x < mp[0].size() - 1){
        if (mp[y][x] <= mp[y][x + 1]){
            dfs(mp, visit, y, x + 1);
        }
    }
}

int main(){
    int n, m;
    cin >> n >> m;
    vector<vector<int>> mp(n, vector<int>(m, 0));
    vector<vector<int>> visit1(n, vector<int>(m, 0));
    vector<vector<int>> visit2(n, vector<int>(m, 0));
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            cin >> mp[i][j];
        }
    }
    for (int i = 0; i < n; i++){
        dfs(mp, visit1, i, 0);
        dfs(mp, visit2, i, m - 1);
    }
    for (int i = 0; i < m; i++){
        dfs(mp, visit1, 0, i);
        dfs(mp, visit2, n - 1, i);
    }
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            if (visit1[i][j] == 1 && visit2[i][j] == 1){
                cout << i << " " << j << "\n";
            }
        }
    }
    
    return 0;
}

笔者想出的是随想录中比较暴力的解法,笔者想过对暴力的这种做优化,比如在dfs的遍历过程中对节点做标记,标记节点能到哪一类边界,之后的遍历中将周围节点的判决作为依据,减少计算量,但想了想还是有不妥。因为在遍历中很重要的一步是对遍历的流向做限制,比如先遇到的节点是[0][0],那么之后可以从[0][0]到[0][1],但在进入[0][1]后不能再对[0][0]做访问,这是为了避免遍历陷入无限的循环,但在这题中,相同高度的两类节点间,流向是双向的,也就意味着笔者的优化想法会舍弃掉一种流向,导致潜在的错误,而对这个情况,笔者所能想到的解决方法是只对能流到两类边界的节点做标记,但这样同时也会导致一些点被遍历多次的情况出现。

所以笔者还是看了看更巧妙的逆流而上的解法来写。逆流而上的优势在于,遍历过程中只需要考虑一类边界逆流而上所能到达的范围,不需要考虑双向流向,所以在遍历过程中可以对节点做标记,对已经做标记的节点不需要做操作,在对两类边界都遍历一次后,取两个范围的交集即可,最极端的情况也只需对所有点做2次访问就能确定。

代码随想录 103. 水流问题

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

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

相关文章

理解C语言之深入理解指针(五)

目录 1. sizeof和strlen的对⽐ 1.1 sizeo 1.2 strlen 1.3 sizeof和strlen的对⽐ 2. 数组和指针笔试题解析 2.1 ⼀维数组 2.2 字符数组 2.3 ⼆维数组 3. 指针运算笔试题解析 3.1 题⽬1&#xff1a; 3.2 题⽬2 3.3 题⽬3 3.4 题⽬4 3.5 题⽬5 3.6 题⽬6 3.7 题⽬…

鸿蒙开发之ArkUI 界面篇 二十一 人气卡片综合案例

要实现如下图效果&#xff1a; 仔细分析效果&#xff0c;整体分为三个区域&#xff0c;分别是1、2、3&#xff0c;如图所示 我们整体分析&#xff0c;区域1是观察到的是图片&#xff0c;自然是Image组件&#xff0c;区域2有个背景&#xff0c;左边是Image&#xff0c;水平方向…

《Spring Microservices in Action, 2nd Edition》读后总结

总体来说有种时过境迁的感觉&#xff0c;有些章节的内容已经跟不上现在&#xff0c;特别对于云原生大行其道的当下&#xff0c; 越来越多东西下沉到基础设施层&#xff0c;然后应用层尽量轻量化成了一种新趋势&#xff1b;当然任何事物都具有多面性&#xff0c;云原生那套也要投…

21世纪现代国学四大泰斗颜廷利教授:一位多面兼具深度的思想家

颜廷利&#xff0c;出生于1971年10月15日的这位杰出人物&#xff0c;来自中国山东省济南市的一个平凡家庭。他在北京大学接受了高等教育&#xff0c;专攻哲学和教育学&#xff0c;深入探索了东西方哲学理论。他的研究领域涵盖了哲学、文化、经济等多个领域&#xff0c;并在易经…

【element-tiptap】报错Duplicate use of selection JSON ID cell at Selection.jsonID

我是下载了element-tiptap 给出的示例项目&#xff0c;在本地安装依赖、运行报错了&#xff0c; 报错截图&#xff1a; 在项目目录下找 node_modules/tiptap-extensions/node-modules&#xff0c;把最后的 node-modules 目录名字修改一下&#xff0c;例如修改为 node-modules–…

亨廷顿舞蹈症患者必知的营养补充指南

在生活的舞台上&#xff0c;每个人都是自己故事的主角&#xff0c;即使面对如亨廷顿舞蹈症&#xff08;HD&#xff09;这样的挑战&#xff0c;我们依然可以通过科学的饮食管理&#xff0c;为健康之路增添更多希望与色彩。今天&#xff0c;就让我们一起探索亨廷顿舞蹈症患者应该…

【汇编语言】寄存器(CPU工作原理)(四)—— “段地址x16 + 偏移地址 = 物理地址”的本质含义以及段的概念和小结

文章目录 前言1. "段地址x16 偏移地址 物理地址"的本质含义2. 段的概念3. 内存单元地址小结结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实…

单片机教案 1.1 ATmega2560单片机概述

第一章 迈进单片机的大门 Arduino是一款便捷灵活、方便上手的开源电子原型平台&#xff0c;为迈进单片机的大门提供了良好的入门途径。以下是对Arduino的详细介绍&#xff1a; 一、Arduino简介 Arduino是一个能够用来感应和控制现实物理世界的一套工具&#xff0c;它由一个基…

C++ 基于SDL库的 Visual Studio 2022 环境配置

系统&#xff1a;w10、编辑器&#xff1a;Visual Studio 2022、 下载地址 必要库&#xff1a; SDL https://github.com/libsdl-org/SDL 字体 https://github.com/libsdl-org/SDL_ttf 图片 https://github.com/libsdl-org/SDL_image 音频 https://github.com/libsdl-org/SDL_m…

连续点击三次用户

有用户点击日志记录表 t2_click_log&#xff0c;包含user_id(用户ID),click_time(点击时间)&#xff0c;请查询出连续点击三次的用户数&#xff0c; 连续点击三次&#xff1a;指点击记录中同一用户连续点击&#xff0c;中间无其他用户点击&#xff1b; CREATE TABLE t2_click…

两个div中间有缝隙

两个div中间有缝隙效果图&#xff1a; 这种是display:inline-block造成的 在父元素中加入font-size:0px;&#xff0c;再在相应的子div中加入font-size:12px;就可以了 调整后效果图&#xff1a;

Pandas和Seaborn数据可视化

Pandas数据可视化 学习目标 本章内容不需要理解和记忆&#xff0c;重在【查表】&#xff01; 知道数据可视化的重要性和必要性知道如何使用Matplotlib的常用图表API能够找到Seaborn的绘图API 1 Pandas数据可视化 一图胜千言&#xff0c;人是一个视觉敏感的动物&#xff0c;大…

数据库-分库分表

什么是分库分表 分库分表是一种数据库优化策略。 目的&#xff1a;为了解决由于单一的库表数据量过大而导致数据库性能降低的问题 分库&#xff1a;将原来独立的数据库拆分成若干数据库组成 分表&#xff1a;将原来的大表(存储近千万数据的表)拆分成若干个小表 什么时候考虑分…

Web 性能优化|了解 HTTP 协议后才能理解的预加载

作者&#xff1a;谦行 一、前言 在性能优化过程中&#xff0c;开发者通常会集中精力在以下几个方面&#xff1a;服务器响应时间&#xff08;RT&#xff09;优化、服务端渲染&#xff08;SSR&#xff09;与客户端渲染优化、以及静态资源体积的减少。然而&#xff0c;对于许多用…

C(十五)函数综合(一)--- 开公司吗?

在这篇文章中&#xff0c;杰哥将带大家 “开公司”。 主干内容部分&#xff08;你将收获&#xff09;&#xff1a;&#x1f449; 为什么要有函数&#xff1f;函数有哪些&#xff1f;怎么自定义函数以及获得函数的使用权&#xff1f;怎么对函数进行传参&#xff1f;函数中变量的…

[嵌入式Linux]—STM32MP1启动流程

STM32MP1启动流程 1.启动模式 STM32MP1等SOC支持从多种设备中启动&#xff0c;如EMMC、SD、NAND、NOR、USB、UART等。其中USB、UART是作为烧录进行启动的。 STM32MP1内部ROM中存储有一段出厂代码来进行判断从哪种设备中启动&#xff0c;上电后这段代码会被执行&#xff0c;这…

使用java函数逆序一个单链表

代码功能 定义了一个ListNode类&#xff0c;用于表示单链表的节点&#xff0c;每个节点包含一个整数值和一个指向下一个节点的引用。 在ReverseLinkedList类的main方法中&#xff0c;创建了一个包含从1到10的整数的单链表。 定义了一个printList方法&#xff0c;用于打印链表的…

基于JavaWeb开发的java springmvc+mybatis酒水商城管理系统设计和实现

基于JavaWeb开发的java springmvcmybatis酒水商城管理系统设计和实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承…

【JAVA基础】集合类之HashSet的原理及应用

近期几期内容都是围绕该体系进行知识讲解&#xff0c;以便于同学们学习Java集合篇知识能够系统化而不零散。 本文将介绍HashSet的基本概念&#xff0c;功能特点&#xff0c;使用方法&#xff0c;以及优缺点分析和应用场景案例。 一、概念 HashSet是 Java 集合框架中的一个重…

Spring Boot实现License生成与校验详解

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在软件开发领域&#xff0c;License&#xff08;许可证&#xff09;机制是保护软件版权、控制软件使用范围的重要手段。通过为软件生成唯一的License&#xff0c;开发者可以确保只有合法用户才能使用软件&…