C++ 中的独特路径 III


假设我们有一个二维网格,有 4 种类型的方块 -

  • 在一个方块中,1 代表起点。将只有一个起点方块。

  • 在一个方块中,2 代表终点。将只有一个终点方块。

  • 在一个方块中,0 代表空方块,我们可以走过。

  • 在一个方块中,-1 代表障碍物,我们无法走过。

我们需要找到从起点方块到终点方块的 4 个方向的行走路径的数量,这些路径恰好遍历每个非障碍物方块一次。

因此,如果输入如下 -

1000
0000
102-1

则输出将是 2,因为我们有以下两条路径:(0,0), (0,1), (0,2), (0,3), (1,3), (1,2), (1,1),(1,0), (2,0), (2,1), (2,2) 和 (0,0), (1,0), (2,0), (2,1), (1,1), (0,1), (0,2), (0,3), (1,3), (1,2), (2,2)。

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

  • 定义一个函数 dfs(),它将接收一个二维数组 grid、i、j、ex、ey、empty 作为参数。

  • 如果 i、j 不在 grid 的范围内或 grid[i, j] 等于 -1,则 -

    • 返回 0

  • 如果 grid[i, j] 等于 2,则

    • 当 empty 等于 -1 时返回 true

  • x := 0

  • (将 empty 减 1)

  • grid[i, j] := -1

  • 初始化 k := 0,当 k < 4 时,更新 (将 k 加 1),执行 -

    • nx := i + dir[k, 0]

    • ny := j + dir[k, 1]

    • x := x + dfs(grid, nx, ny, ex, ey, empty)

  • (将 empty 加 1)

  • grid[i, j] := 0

  • 返回 x

  • 在方法中执行以下操作 -

  • empty := 0

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

  • 初始化 i := 0,当 i < n 时,更新 (将 i 加 1),执行 -

    • 初始化 j := 0,当 j < m 时,更新 (将 j 加 1),执行 -

      • 如果 grid[i, j] 等于 0,则

        • (将 empty 加 1)

      • 否则,如果 grid[i, j] 等于 1,则 -

        • sx := i, sy := j

      • 否则,如果 grid[i, j] 等于 2,则 -

        • ex := i, ey := j

  • 返回 dfs(grid, sx, sy, ex, ey, empty)

让我们看看以下实现,以便更好地理解 -

示例

 实时演示

#include <bits/stdc++.h>
using namespace std;
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
class Solution {
   public:
   int dfs(vector<vector<int> >& grid, int i, int j, int ex, int ey,
   int empty){
      if (i >= grid.size() || i < 0 || j >= grid[0].size() || j < 0
      || grid[i][j] == -1)
      return 0;
      if (grid[i][j] == 2) {
         return empty == -1;
      }
      int x = 0;
      empty--;
      grid[i][j] = -1;
      for (int k = 0; k < 4; k++) {
         int nx = i + dir[k][0];
         int ny = j + dir[k][1];
         x += dfs(grid, nx, ny, ex, ey, empty);
      }
      empty++;
      grid[i][j] = 0;
      return x;
   }
   int uniquePathsIII(vector<vector<int> >& grid){
      int empty = 0;
      int sx, sy, ex, ey;
      int n = grid.size();
      int m = grid[0].size();
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < m; j++) {
            if (grid[i][j] == 0)
            empty++;
            else if (grid[i][j] == 1) {
               sx = i;
               sy = j;
            }
            else if (grid[i][j] == 2) {
               ex = i;
               ey = j;
            }
         }
      }
      return dfs(grid, sx, sy, ex, ey, empty);
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{1,0,0,0},{0,0,0,0},{0,0,2,-1}};
   cout << (ob.uniquePathsIII(v));
}

输入

{{1,0,0,0},{0,0,0,0},{0,0,2,-1}}

输出

2

更新于: 2020-06-08

187 次查看

开启你的 职业生涯

完成课程获得认证

开始学习
广告

© . All rights reserved.