1730. 获取食物的最短路径(BFS)
1730. 获取食物的最短路径
你现在很饿,想要尽快找东西吃。你需要找到最短的路径到达一个食物所在的格子。
给定一个 m x n
的字符矩阵 grid
,包含下列不同类型的格子:
'*'
是你的位置。矩阵中有且只有一个'*'
格子。'#'
是食物。矩阵中可能存在多个食物。'O'
是空地,你可以穿过这些格子。'X'
是障碍,你不可以穿过这些格子。
返回你到任意食物的最短路径的长度。如果不存在你到任意食物的路径,返回 -1
。
示例 1:

输入: grid = [["X","X","X","X","X","X"],["X","*","O","O","O","X"],["X","O","O","#","O","X"],["X","X","X","X","X","X"]] 输出: 3 解释: 要拿到食物,你需要走 3 步。
Example 2:

输入: grid = [["X","X","X","X","X"],["X","*","X","O","X"],["X","O","X","#","X"],["X","X","X","X","X"]] 输出: -1 解释: 你不可能拿到食物。
示例 3:

输入: grid = [["X","X","X","X","X","X","X","X"],["X","*","O","X","O","#","O","X"],["X","O","O","X","O","O","X","X"],["X","O","O","O","O","#","O","X"],["X","X","X","X","X","X","X","X"]] 输出: 6 解释: 这里有多个食物。拿到下边的食物仅需走 6 步。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
grid[row][col]
是'*'
、'X'
、'O'
或'#'
。grid
中有且只有一个'*'
。
解题思路:
看到这个题目,很明显是一个BFS求最少步数问题
1 class Solution { 2 public: 3 static constexpr int g_direction[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; 4 // 找到起始位置 5 bool getStartPosition(const vector<vector<char>> &grid, std::pair<int, int> &start) { 6 if (grid.size() <= 0 || grid[0].size() <= 0) { 7 return false; 8 } 9 int row = grid.size(); 10 int cow = grid[0].size(); 11 for (int i = 0; i < row; i++) { 12 for (int j = 0; j < cow; j++) { 13 if (grid[i][j] == '*') { 14 start = make_pair(i, j); 15 return true; 16 } 17 } 18 } 19 return false; 20 } 21 int getFood(vector<vector<char>>& grid) { 22 if (grid.size() <= 0 || grid[0].size() <= 0) { 23 return -1; 24 } 25 int row = grid.size(); 26 int cow = grid[0].size(); 27 // 找到起始位置('*'所在位置坐标) 28 std::pair<int, int> start; 29 if (getStartPosition(grid, start) != true) { 30 return -1; 31 } 32 // 将起始位置入队列进行BFS,找到第一次到达食物位置的最短步数 33 vector<vector<bool>> visited(row, vector<bool>(cow, false)); 34 queue<std::pair<int, int>> q; 35 q.push(start); 36 visited[start.first][start.second] = true; 37 int step = 0; 38 while (!q.empty()) { 39 int size = q.size(); 40 for (int i = 0; i < size; i++) { 41 int x = q.front().first; 42 int y = q.front().second; 43 q.pop(); 44 // 如果找到食物,则返回走过的步数 45 if (grid[x][y] == '#') { 46 return step; 47 } 48 // 如果没找到,则向四个方向继续找 49 for (int j = 0; j < 4; j++) { 50 int xNext = x + g_direction[j][0]; 51 int yNext = y + g_direction[j][1]; 52 // 如果超过了边界或者遇到障碍物,则该格子不能走 53 if ((xNext >= 0 && xNext < row) && (yNext >= 0 && yNext < cow) && 54 !visited[xNext][yNext] && grid[xNext][yNext] != 'X') { 55 q.push(make_pair(xNext, yNext)); 56 visited[xNext][yNext] = true; 57 } 58 } 59 } 60 step++; 61 } 62 return -1; 63 } 64 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具