当前位置: 首页 > news >正文

KamaCoder 103. 水流问题

题目要求

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.mrgr.cn/news/33519.html

相关文章:

  • 【MySQL】库的操作
  • 联合体的用法和用联合体判断大小端存储
  • 【排序算法】插入排序_直接插入排序、希尔排序
  • c# 三元表达式
  • 开源 AI 智能名片 S2B2C 商城小程序与营销工具的快速迭代
  • priority_queue 与 deque
  • 如果一个线上运行的程序,出现了死锁,应该怎么处理
  • 【记录】Excel|不允许的操作:合并或隐藏单元格出现的问题列表及解决方案
  • Elasticsearch导出导入数据
  • Flyway 基本概念
  • 【深入Java枚举类:不仅仅是常量的容器】
  • 小红书笔记采集器
  • js进阶——函数作用域和块作用域
  • Centrality
  • 【WSL迁移】将WSL2迁移到D盘
  • 《鸿蒙应用开发实战》关注公众号抽奖
  • 深入浅出:Eclipse 中配置 Maven 与 Spark 应用开发全指南
  • 计算机毕业设计之:基于深度学习的路面检测系统(源码+部署文档+讲解)
  • Apache CVE-2021-41773 漏洞攻略
  • Linux网络命令