C++ 迷宫 II


假设在一个迷宫中有一个球,迷宫中有空的空间和墙壁。现在球可以通过滚动任何方向(例如上、下、左或右)穿过空路径,但它不会停止滚动,直到撞到墙壁。当球停止时,它可以选择下一个方向。

我们必须给出球的起始位置、目的地和迷宫,我们必须找到球到达目的地的最短距离。这里的距离实际上是由球覆盖的空单元格的数量定义的(不包括起始位置,包括起始位置)。如果无法让球停在目的地,则返回 -1。

迷宫由一个二维数组表示。这里 1 表示墙壁,0 表示空空间。迷宫的边界都是墙壁。起始和目标坐标由行和列索引表示。

因此,如果输入类似于由二维数组表示的迷宫

00100
00000
00010
11011
00000

起始位置为 (0, 4) 目标位置为 (4, 4),则输出将为 12,一种可能的方式是:左到下到左到下到右到下到右。(1+1+3+1+2+2+2) = 12

为了解决这个问题,我们将遵循以下步骤:

  • n := 行数,m := 列数

  • ret := 无穷大

  • 定义一个 n x m 阶的二维数组 dist

  • 定义一个队列 q

  • 将起点插入 q

  • dist[start[0], start[1]] := 0

  • 当 (q 不为空) 时,执行:

    • curr := q 的第一个元素

    • 从 q 中删除元素

    • x := curr[0], y := curr[1]

    • 如果 x 等于 destination[0] 且 y 等于 destination[1],则:

      • ret := ret 和 dist[x, y] 的最小值

    • currDist := dist[x, y]

    • tempDist := 0

    • i := x

    • 当 (i + 1 < n 且 grid[i + 1, y] 为零) 时,执行:

      • (i 加 1)

      • (tempDist 加 1)

    • 如果 currDist + tempDist < dist[i, y],则:

      • dist[i, y] := currDist + tempDist

      • 将 { i, y } 插入 q

    • i := x

    • tempDist := 0

    • 当 (i - 1 >= 0 且 grid[i - 1, y] 为零) 时,执行:

      • (tempDist 加 1)

      • (i 减 1)

    • 如果 currDist + tempDist *lt; dist[i, y],则:

      • dist[i, y] := currDist + tempDist

      • 将 { i, y } 插入 q

    • i := y

    • tempDist := 0

    • 当 (i - 1 >= 0 且 grid[x, i - 1] 为零) 时,执行:

      • (i 减 1)

      • (tempDist 加 1)

    • 如果 currDist + tempDist < dist[x, i],则:

      • dist[x, i] := currDist + tempDist

      • 将 { x, i } 插入 q

    • i := y

    • tempDist := 0

    • 当 (i + 1 < m 且 grid[x, i + 1] 为零) 时,执行:

      • (i 加 1)

      • (tempDist 加 1)

    • 如果 currDist + tempDist < dist[x, i],则:

      • dist[x, i] := currDist + tempDist

      • 将 { x, i } 插入 q

  • 返回 (如果 ret 等于 inf,则返回 -1,否则返回 ret)

示例

让我们看看以下实现以获得更好的理解:

实时演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int shortestDistance(vector<vector<int<>& grid, vector<int<& start, vector<int<& destination) {
   int n = grid.size();
   int m = n? grid[0].size() : 0;
   int ret = INT_MAX;
   vector < vector <int< > dist(n, vector <int<(m, INT_MAX));
   queue < vector <int< > q;
   q.push(start);
   dist[start[0]][start[1]] = 0;
   while(!q.empty()){
      vector <int< curr = q.front();
      q.pop();
      int x = curr[0];
      int y = curr[1];
      if(x == destination[0] && y == destination[1]){
         ret = min(ret, dist[x][y]);
      }
      int currDist = dist[x][y];
      int tempDist = 0;
      int i = x;
      while(i + 1 < n && !grid[i + 1][y]){
         i++;
         tempDist++;
      }
      if(currDist + tempDist < dist[i][y]){
         dist[i][y] = currDist + tempDist;
         q.push({i, y});
      }
      i = x;
      tempDist = 0;
      while(i - 1 >= 0 && !grid[i - 1][y]){
         tempDist++;
         i--;
      }
      if(currDist + tempDist < dist[i][y]){
         dist[i][y] = currDist + tempDist;
         q.push({i, y});
      }
      i = y;
      tempDist = 0;
      while(i - 1 >= 0 && !grid[x][i - 1]){
         i--;
         tempDist++;
      }
      if(currDist + tempDist < dist[x][i]){
         dist[x][i] = currDist + tempDist;
         q.push({x, i});
      }
      i = y;
      tempDist = 0;
      while(i + 1 < m && !grid[x][i + 1]){
         i++;
         tempDist++;
      }
      if(currDist + tempDist < dist[x][i]){
         dist[x][i] = currDist + tempDist;
         q.push({x, i});
      }
   }
   return ret == INT_MAX ? - 1 : ret;
};
main(){
   Solution ob;
   vector<vector<int<> v = {{0,0,1,0,0},{0,0,0,0,0},{0,0,0,1,0},{1,1,0,1,1},{0,0,0,0,0}};
   vector<int< v1 = {0,4}, v2 = {4,4};
   cout << (ob.shortestDistance(v, v1, v2));
}

输入

{{0,0,1,0,0},{0,0,0,0,0},{0,0,0,1,0},{1,1,0,1,1},{0,0,0,0,0}}, {0,4},{4,4}

输出

12

更新于: 2020年11月19日

455 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告