2023.8.4 不同路径III

image

因为数据范围n,m20,可以考虑爆搜。
使用dfs遍历所有路径,若路径合法,则令答案加一。

可以令dfs维护当前经历过的为0的节点的数量,记做depth,其中grid中含有的0节点的总数为cnt,如果depth == cnt && grid[x][y] == 2,那么说明我们找到了一条合法路径,令答案加一。

class Solution {
public:
    int uniquePathsIII(vector<vector<int>>& grid) 
    {
        int n = grid.size(), m = grid[0].size();

        constexpr int dx[4] = {0, 1, 0, -1};
        constexpr int dy[4] = {-1, 0, 1, 0};
        
        int cnt = 0;
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < m; ++j)
                if (grid[i][j] == 0)
                    ++cnt;

        int res = 0;
        vector<vector<int>> st(n, vector<int>(m));
        function<void(int, int, int)> dfs = [&] (int x, int y, int depth)
        {
            st[x][y] = true;
            for (int i = 0; i < 4; ++i)
            {
                int sx = x + dx[i], sy = y + dy[i];
                if (sx >= 0 && sx < n && sy >= 0 && sy < m && !st[sx][sy] && grid[sx][sy] != -1)
                    dfs(sx, sy, depth + (grid[sx][sy] == 0));
            }
            st[x][y] = false;
            if (grid[x][y] == 2 && cnt == depth)
                ++res;
        };

        for (int i = 0; i < n; ++i)
            for (int j = 0; j < m; ++j)
                if (grid[i][j] == 1)
                {
                    dfs(i, j, 0);
                    break;
                }
        return res;
    }
};

作者:st0rmKR

出处:https://www.cnblogs.com/st0rmKR/p/17605400.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   烤肉kr  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示