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.lengthn == grid[i].length1 <= m, n <= 200grid[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 };
浙公网安备 33010602011771号