代码随想录 103. 水流问题

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.mzph.cn/bicheng/55811.shtml

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

相关文章

计算机网络——http和web

无状态服务器——不维护客户端 怎么变成有状态连接 所以此时本地建立代理—— 若本地缓存了——但是服务器变了——怎么办&#xff1f;

vue 不是spa 单页面应用吗? 配置路由工作模式为history 后 ,为什么配置Nginx的 try_files 可以根据url 找到对应的文件?

免责申明 记录用&#xff0c;本人主要是后端,可能理解有误 Vue.js 是一个前端框架&#xff0c;主要用于构建单页面应用程序&#xff08;SPA&#xff09;。然而&#xff0c;Nginx 是一个服务器端的应用程序&#xff0c;负责处理 HTTP 请求并返回相应的资源。 当在 Vue.js 应用…

Pikachu-File Inclusion-远程文件包含

远程文件包含漏洞 是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的&#xff0c;因此漏洞一旦存在&#xff0c;危害性会很大。但远程文件包含漏洞的利用条件较为苛刻&#xff1b;因此&#xff0c;在web应用系统的功能设计上尽量不要让前端用户直接传变…

用java编写飞机大战

游戏界面使用JFrame和JPanel构建。背景图通过BG类绘制。英雄机和敌机在界面上显示并移动。子弹从英雄机发射并在屏幕上移动。游戏有四种状态&#xff1a;READY、RUNNING、PAUSE、GAMEOVER。状态通过鼠标点击进行切换&#xff1a;点击开始游戏&#xff08;从READY变为RUNNING&am…

深入理解C语言中的内存分配函数:malloc、calloc、realloc

目录&#xff1a; 前言1. malloc&#xff1a;分配内存块2. calloc&#xff1a;分配并初始化内存块3. realloc&#xff1a;重新分配内存块总结 前言 在C语言编程中&#xff0c;动态内存分配是一个非常重要的概念。它允许我们在程序运行时根据需要分配和释放内存&#xff0c;从而…

CSS | 响应式布局之媒体查询(media-query)详解

media type(媒体类型)是CSS 2中的一个非常有用的属性&#xff0c;通过media type我们可以对不同的设备指定特定的样式&#xff0c;从而实现更丰富的界面。media query(媒体查询)是对media type的一种增强&#xff0c;是CSS 3的重要内容之一。随着移动互联网的发展&#xff0c;m…

微信小程序中的 `<block>` 元素:高效渲染与结构清晰的利器

微信小程序中的 <block> 元素&#xff1a;高效渲染与结构清晰的利器 在微信小程序的开发中&#xff0c;<block> 元素扮演着举足轻重的角色。尽管它不会在页面中渲染任何可见的节点&#xff0c;但作为一个逻辑上的容器&#xff0c;<block> 在条件渲染和循环渲…

reactNative本地调试localhost踩坑

本地调试请求localhost的时候 1.要和电脑处在同一局域网下面&#xff08;同一个wifi&#xff09; 2.把baseURL的localhost改成命令行中ipconfig查询到的IPv4 地址 . . . . . . . . . . . . : &#xff08;例如&#xff09;192.168.1.103 如果报错Net Work Error&#xff0c;可…

C语言普及难度三题

先热个身&#xff0c;一个长度为10的整型数组&#xff0c;输出元素的差的max和min。 #include<stdio.h> int main() {int m[10],i0,max,min;for(i0;i<10;i){scanf("%d",&m[i]);}minm[0];maxm[0];for (i 0; i <10; i){if(min>m[i]) min m[i];i…

BMC pam认证的使用

1.说明 1.1 文档参考资料 https://www.chiark.greenend.org.uk/doc/libpam-doc/html/Linux-PAM_ADG.htmlhttp://www.fifi.org/doc/libpam-doc/html/pam_appl-3.htmlpdf文档: https://fossies.org/linux/Linux-PAM-docs/doc/adg/Linux-PAM_ADG.pdflinux-pam 中文文档pam 旧文p…

Redis基础二(spring整合redis)

Springboot整合Redis 一、Springboot整合redis ​ redis可以通过使用java代码来实现 第一部分文档中 在终端操作redis的所有命令&#xff0c;Spring已经帮我们封装了所有的操作&#xff0c;所以变得很简单了。 ​ Spring专门提供了一个模块来进行这些操作的封装&#xff0c;这…

【Linux】详解Linux下的工具(内含yum指令和vim指令)

文章目录 前言1. Linux下软件安装的方式2. yum2.1 软件下载的小知识2.2 在自己的Linux系统下验证yum源的存在2.3 利用yum指令下载软件2.4 拓展yum源&#xff08;针对于虚拟机用户&#xff09; 3. vim编辑器3.1 vim是什么&#xff1f;3.2 如何打开vim3.2 vim各模式下的讲解3.2.1…

Oracle中ADD_MONTHS()函数详解

文章目录 前言一、ADD_MONTHS()的语法二、主要用途三、测试用例总结 前言 在Oracle数据库中&#xff0c;ADD_MONTHS()函数用于在日期中添加指定的月数。 一、ADD_MONTHS()的语法 ADD_MONTHS(date, n) 其中&#xff0c;date是一个日期值&#xff0c;n是一个整数值&#xff0c…

基于vue框架的大学生学业预警系统设计与实现53ify(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,公告信息,成绩信息,科目,学分信息,考勤信息,教师 开题报告内容 基于Vue框架的大学生学业预警系统设计与实现开题报告 一、研究背景与意义 随着高等教育的普及与深入&#xff0c;大学生群体规模日益扩大&#xff0c;其学业管理成…

百元头戴式耳机哪款口碑爆棚+质价比高?2024耳机最强推荐攻略!

在2024年的耳机市场中&#xff0c;百元头戴式耳机凭借其亲民的价格和出色的性能&#xff0c;成为了众多消费者的首选。随着技术的不断进步&#xff0c;这一价位段的耳机不仅在音质上有了显著提升&#xff0c;还在舒适度、降噪能力以及续航时间等方面表现出色。那百元头戴式耳机…

CAN XL协议标准在CANoe中的应用

众所周知&#xff0c;CAN通信技术在汽车领域中&#xff0c;有着非常广泛的应用。从1991年&#xff0c;第一代经典CAN在奔驰S级轿车中首次应用&#xff1b;到2011年&#xff0c;开始第二代CAN总线&#xff08;即CAN FD&#xff09;的开发&#xff1b;如今&#xff0c;ISO 11898-…

MyBatis 操作数据库入门

目录 前言 1.创建springboot⼯程 2.数据准备 3.配置Mybatis数据库连接信息 4.编写SQL语句&#xff0c;进行测试 前言 什么是MyBatis? MyBatis是⼀款优秀的 持久层 框架&#xff0c;⽤于简化JDBC的开发 Mybatis操作数据库的入门步骤&#xff1a; 1.创建springboot⼯程 2.数…

kwin- 插件加载绘制流程

1. 配置文件的作用具体是做什么的&#xff1f; 相当于用户强制设置了特效的开关&#xff0c;对于没有写在配置文件里的特效&#xff0c;会检测默认加载值&#xff0c;确定是否加载。写在了文件里的会根据返回的值&#xff0c;来加载特效。 2. 为什么配置文件没有写&#xff0c…

【自用】王道文件管理强化笔记

文章目录 操作系统引导:磁盘初始化文件打开过程角度1文件的打开过程角度2 内存映射的文件访问 操作系统引导: ①CPU从一个特定主存地址开始&#xff0c;取指令&#xff0c;执行ROM中的引导程序(先进行硬件自检&#xff0c;再开机) ②)将磁盘的第一块–主引导记录读入内存&…

【Ubuntu】git

文章目录 1.配置SSH key2. 基础知识操作命令1分支branch 如果对git命令使用不熟悉&#xff0c;推荐一个非常棒的git在线练习工具 Learn Git Branching。 https://m.runoob.com/git/git-basic-operations.html 1.配置SSH key ssh-keygen -t rsa -C "YOUR EMAIL"完成…