- grid要遍历所有的格点的题,都是用dfs, bfs遍历;
- 主函数就是遍历,从左上到右下,调用
dfs
函数; - 所有的约束条件都在
dfs
这个辅助函数中; - 如果
0
表示不能进入并且每个cell只能遍历一次,那么遍历grid[i][j]
之后把它赋值为0:grid[i][j]=0
这样下次就不会经过这个节点了; - 因为是累加得到最后的结果,所以每次都是
temp+dfs(grid, ixx, jxx)
; - 朝不同的方向dfs每次得到的结果并不一定会变大,所以用
max
函数.
C++:
class Solution {
int m, n;
public:
int getMaximumGold(vector<vector<int>>& grid) {
int res = 0;
m = grid.size();
n = grid[0].size();
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
res = max(res, dfs(grid, i, j)); // 这里并不累加得到最终结果,逻辑处理都在dfs函数中
}
}
return res;
}
int dfs(vector<vector<int>>& grid, int i, int j) {
if (grid[i][j] == 0) return 0;
int temp = grid[i][j];
int res = 0;
grid[i][j] = 0;
if (i < m-1) res = max(res, temp + dfs(grid, i+1, j));
if (i > 0) res = max(res, temp + dfs(grid, i-1, j));
if (j < n-1) res = max(res, temp + dfs(grid, i, j+1));
if (j > 0) res = max(res, temp + dfs(grid, i, j-1));
grid[i][j] = temp;
return res;
}
};