深度优先搜索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; } };
从新写了份新的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'; } };
【Over】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!