代码随想录 103. 水流问题

embedded/2024/10/8 23:19:43/

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.ppmy.cn/embedded/124771.html

相关文章

10.7学习

1.安全认证 ●Session 认证中最常用的一种方式&#xff0c;也是最简单的。存在多节点session丢失的情况&#xff0c;可通过nginx粘性Cookie和Redis集中式Session存储解决 ●HTTP Basic Authentication 服务端针对请求头中base64加密的Authorization 和用户名和密码进行校验。…

redis数据类型介绍

1. 字符串&#xff08;String&#xff09; 字符串是 Redis 中最基本的数据类型&#xff0c;它可以存储任何形式的字符串&#xff0c;包括文本、数字等。字符串类型的操作非常丰富&#xff0c;比如 SET、GET、INCR&#xff08;自增&#xff09;、DECR&#xff08;自减&#xff0…

sqli-labs靶场第五关less-5

sqli-labs less-5 本次测试由虚拟机搭建靶场&#xff0c;主机浏览器中基于hackbar插件进行测试 1、确定注入点及注入类型 输入&#xff1a; http://192.168.128.3/sq/Less-5/?id1 http://192.168.128.3/sq/Less-5/?id2 发现页面回显都一致&#xff0c; 输入 http://192.168…

检查jar冲突,查找存在相同class的jar

写在前面 本文看下如何查找jar冲突&#xff0c;即查找哪些jar包中存在相同的class。如果是存在相同jar的不同版本&#xff0c;基本一眼就能看出来&#xff0c;然后结合maven的依赖关系将其剔除掉即可&#xff0c;但是当你遇到了有人手动拷贝某些class到jar包中导致冲突的情况时…

第十一章 缓存之更新/穿透/雪崩/击穿

目录 一、什么是缓存 二、缓存更新策略 2.1. 缓存主动更新策略 2.1.1. Cache Aside模式&#xff08;主流&#xff09;‌ 2.1.2. Read/Write Through模式‌ 2.1‌.3. Write Behind模式‌ 2.1.4. 总结 三、缓存穿透 四、缓存雪崩 五、缓存击穿 5.1. 互斥锁实现 5.1.1…

python爬虫 - 进阶requests模块

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、SSL证书问题 &#xff08;一&#xff09;跳过 SSL 证书验证 &#xff0…

Java基础(上)

Java的特性 简单易学&#xff08;语法简单&#xff0c;上手容易&#xff09;&#xff1b; 面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b; 平台无关性&#xff08; Java 虚拟机实现平台无关性&#xff09;&#xff1b; 支持多线程&…

信息学奥赛使用的编程IDE:Dev-C++ 安装指南

信息学奥赛&#xff08;NOI&#xff09;作为全国性的编程竞赛&#xff0c;要求参赛学生具备扎实的编程能力&#xff0c;而熟练使用适合的编程工具则是学习与竞赛的基础。在众多编程环境中&#xff0c;Dev-C IDE 因其简洁、轻量、支持C编程等特点&#xff0c;成为许多参赛者的常…