深度优先搜索tip

原题在这里

本来是一道很普通的搜索题,但是因为做得急,没动脑子,结果反而被卡住了一个小时。

我的解法(错误的):

  直接遍历地图上O处的点,dfs四周,条件为当该点(x,y)出界or延伸点(a,b)出界则return false,否则修改(x,y)

    错误点:

      一,vis回溯写的不规范,且没考虑完整,一种是单独考虑该点xy的vis,另一种是记忆化搜索的vis,然后我写混了(菜)

      二,逻辑bug:当在边界搜索到一个三路被拦截的O点时候,因为无路可走,则该点会被修改,然而源点O的其他路径并不一定是死路。

    解决:

      多带了个参数表示源点,整理回溯状态为单独考虑该点的vis,但这样处理效率很低,然后理所应当的TLE了

code:

复制代码
class Solution
{
    vector<vector<bool>> vis;
    vector<vector<char>> mp;
    int l, r;
    int f[4] = {1, 0, 0, -1};
    int g[4] = {0, 1, -1, 0};
    //该点出界或延伸点出界则不修改
    bool dfs(int x, int y, int u, int v)
    {
        vis[x][y] = true;
        for (int i = 0; i < 4; ++i)
        {
            int a = x + f[i], b = y + g[i];
            if (0 <= a && a < l && 0 <= b && b < r)
            {
                if (!vis[a][b] && mp[a][b] == 'O' && dfs(a, b, u, v) == false)
                {
                    vis[x][y] = false;
                    return false;
                }
            }
            else
            {
                vis[x][y] = false;
                return false;
            }
        }
        if (u == x && v == y)
            mp[x][y] = 'X';
        vis[x][y] = false;
        return true;
    }

public:
    void solve(vector<vector<char>> &board)
    {
        l = board.size();
        r = board[0].size();
        mp = board;
        vis = vector<vector<bool>>(l, vector<bool>(r, false));
        for (int i = 0; i < l; ++i)
            for (int j = 0; j < r; ++j)
                if (mp[i][j] == 'O')
                    dfs(i, j, i, j);
        board = mp;
    }
};
TLE未AC
复制代码

从新写了份新的code思路:

  从四边边界的O开始深搜,把深搜到的所有O点全部标记,二次遍历的所有O改为X即可。

code:

复制代码
class Solution
{
    vector<vector<char>> mp;
    int l, r;
    int f[4] = {1, 0, 0, -1};
    int g[4] = {0, 1, -1, 0};
    //该点出界或延伸点出界则不修改
    void dfs(int x, int y)
    {
        mp[x][y] = 'A';
        for (int i = 0; i < 4; ++i)
        {
            int a = x + f[i], b = y + g[i];
            if (0 <= a && a < l && 0 <= b && b < r && mp[a][b] == 'O')
                dfs(a, b);
        }
    }

public:
    void solve(vector<vector<char>> &board)
    {
        l = board.size();
        r = board[0].size();
        mp = board;
        for (int i = 0; i < l; ++i)
            for (int j = 0; j < r; ++j)
                if (mp[i][j] == 'O' && (i == 0 || i == l - 1 || j == 0 || j == r - 1))
                    dfs(i, j);
        for (int i = 0; i < l; ++i)
            for (int j = 0; j < r; ++j)
                if (mp[i][j] != 'A')
                    board[i][j] = 'X';
    }
};
AC
复制代码

【Over】

posted @   Renhr  阅读(30)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示