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 };
复制代码
posted @   跳动的休止符  阅读(365)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示