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