🗒️2658. 网格图中鱼的最大数目
2025-3-5
| 2025-3-5
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
创建时间
Mar 5, 2025 11:28 AM
给你一个下标从 0 开始大小为 m x n 的二维整数数组 grid ,其中下标在 (r, c) 处的整数表示:
  • 如果 grid[r][c] = 0 ,那么它是一块 陆地 。
  • 如果 grid[r][c] > 0 ,那么它是一块 水域 ,且包含 grid[r][c] 条鱼。
一位渔夫可以从任意 水域 格子 (r, c) 出发,然后执行以下操作任意次:
  • 捕捞格子 (r, c) 处所有的鱼,或者
  • 移动到相邻的 水域 格子。
请你返回渔夫最优策略下, 最多 可以捕捞多少条鱼。如果没有水域格子,请你返回 0 。
格子 (r, c) 相邻 的格子为 (r, c + 1) ,(r, c - 1) ,(r + 1, c) 和 (r - 1, c) ,前提是相邻格子在网格图内。

DFS

再次改进 DFS 模板
这是使用这个模板的
使用函数式的
另一种写法
对比不同点:
这两种写法的区别在于递归lambda的实现方式,主要涉及C++中lambda表达式的自引用问题:
  1. 第一个版本(使用std::function)
      • 通过std::function包装lambda,并在lambda内部直接调用该function对象。
      • 问题:lambda在初始化时捕获了尚未完全构造的std::function对象,形成悬空引用。当递归调用时,可能访问到未完全初始化的function对象,导致未定义行为(如崩溃或错误结果)。
  1. 第二个版本(显式传递lambda自身)
      • 在lambda参数中显式传递自身(auto& dfs),递归时通过参数传递。
      • 优点:完全避免了自引用问题。通过模板参数推导,lambda直接操作自身实例,无需依赖外部未初始化的对象,保证了递归的正确性。
核心区别:第二个版本通过参数传递lambda自身,绕过了C++中lambda不能直接递归的限制,而第一个版本由于初始化顺序问题存在未定义行为的风险。因此,第二种写法是正确且安全的递归lambda实现方式。

📎 参考

  • 【题单】网格图(DFS/BFS/综合应用)
  • 1034. 边界着色LCS 03. 主题空间
    Loading...