1219.黄金矿工
链接:1219.黄金矿工
难度:Medium
标签:数组、回溯、矩阵
简介:要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。
题解 1 - cpp
- 编辑时间:2022-02-05
- 执行用时:580ms
- 内存消耗:169.2MB
- 编程语言:cpp
- 解法介绍:dfs。
int dirs[4][2] = {
    {0, 1},
    {0, -1},
    {1, 0},
    {-1, 0},
};
class Solution {
   public:
    int m, n, ans = 0;
    int getMaximumGold(vector<vector<int>>& grid) {
        m = grid.size();
        n = grid[0].size();
        vector<vector<int>> check(m, vector(n, 0));
        for (int row = 0; row < m; row++) {
            for (int col = 0; col < n; col++) {
                if (grid[row][col] == 0) continue;
                int cnt = 0;
                for (int i = 0; i < 4; i++) {
                    int nrow = row + dirs[i][0], ncol = col + dirs[i][1];
                    if (nrow >= 0 && nrow < m && ncol >= 0 && ncol < n &&
                        grid[nrow][ncol] != 0)
                        cnt++;
                }
                if (cnt < 3) dfs(grid, check, row, col, 0);
            }
        }
        return ans;
    }
    void dfs(vector<vector<int>>& grid, vector<vector<int>> check, int row,
             int col, int cur) {
        check[row][col] = 1;
        cur += grid[row][col];
        ans = max(ans, cur);
        for (int i = 0; i < 4; i++) {
            int nrow = row + dirs[i][0], ncol = col + dirs[i][1];
            if (nrow < 0 || nrow >= m || ncol < 0 || ncol >= n ||
                grid[nrow][ncol] == 0 || check[nrow][ncol] == 1)
                continue;
            dfs(grid, check, nrow, ncol, cur);
        }
        check[row][col] = 0;
    }
};