DFS,BFS

dfs和bfs都是分为两个函数

主函数负责寻找每一个没被访问过且是陆地的点,

前面的函数负责的是,把这个点相连的陆地都放问一遍。

也就是,主函数每找到一个符合要求的点,就是找到了一块陆地。

之所以「主函数每找一个合规点 = 一块陆地」,是因为 dfs 把整块都标成了 visited ,主函数后面扫到同块里的其他点时,它们已经被访问过,不会再触发新的 flood。于是每块陆地只被数一次------这就是 count++ 放主函数、不放 dfs 的原因。

水流问题:

是 遍历每个点,然后看这个点 能不能同时到达第一组边界和第二组边界。

第一个方法的 dfs,输出的是一句话:「从起点 (x,y) 出发,水顺着能流到的所有格子」 ------也就是 visited 图上被标成 true 的那一片连通区域。

具体拆开说:

  • dfs(grid, visited, x, y) 跑完之后,visited[i][j] == true 的含义是:存在一条从 (x,y)(i,j) 的「高度不增」路径(每步走到 ≤ 自己的邻居,水往低处流)。
  • 换句话说,visited = 这个点肚子里的水能漫到的全部地盘。
  • 然后 isResult 拿这张图去问两件事:
    • 这片地盘有没有碰到上边或左边 ?→ isFirst
    • 这片地盘有没有碰到下边或右边 ?→ isSecond
    • 都碰到 → 说明 (x,y) 的水能同时流进两组边界(两片海),返回 true

优化

那么我们可以 反过来想,从第一组边界上的节点 逆流而上,将遍历过的节点都标记上。

同样从第二组边界的边上节点 逆流而上,将遍历过的节点也标记上。

然后两方都标记过的节点就是既可以流向第一组边界也可以流向第二组边界的节点

从第一组边界边上节点出发,如图: (图中并没有把所有遍历的方向都画出来,只画关键部分)

,意思是cong第一边界和第二边界分别深搜,往高处走,走过的就在各自的visit图上标注1,如果两个图都标1了就代表这个点是我们要找的。

方法一是,每个点一副自己流过的01图,然后去对比是否在第一区和二区都有为1的点。第二个是全局一共就维护两幅图,一个是一区能到达的点,一个是二区能到达的点,如果两个有重叠的就输出

  • 方法一:N 张图,每张图自问「我碰没碰到边界」 → 每个点各算各的,重复且慢(O((nm)²))。
  • 方法二:2 张图,每张图自问「边界能碰到谁」 → 全局算一次,取交集,干净且快(O(nm))。
相关推荐
find1star6 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing7 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21127 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP8 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN8 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218318 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤9 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate9 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran10 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹10 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统