C ++中的独特路径III
在正方形中,1是起点。恰好会有一个起始方块。
在正方形中2是终点。恰好会有一个结尾正方形。
在正方形中,0是空的正方形,我们可以走过去。
如果遇到障碍,我们不能走过正方形-1。
我们必须找到从开始方块到结束方块的4向步行次数,这些步行在每个非障碍方块上恰好走了一次。
所以,如果输入像-
那么输出将为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(),它将采用一个2D数组网格,即i,j,ex,ey,empty,
如果i,j不在grid或grid[i,j]的范围内,则等于-1,则-
返回0
如果grid[i,j]与2相同,则
如果为-1,则返回true
x:=0
(将空值减少1)
格[i,j]:=-1
对于初始化k:=0,当k<4时,更新(将k增加1),执行-
nx:=i+dir[k,0]
ny:=j+dir[k,1]
x:=x+dfs(网格,nx,ny,ex,ey,空)
(将空值增加1)
grid[i,j]:=0
返回x
从方法中执行以下操作-
空:=0
n:=行数,m:=列数
对于初始化i:=0,当i<n时,更新(将i增加1),执行-
如果grid[i,j]等于0,则
否则,当grid[i,j]等于1时,则-
否则,当grid[i,j]与2相同时,则-
(将空值增加1)
sx:=i,sy:=j
例如:=i,ey:=j
对于初始化j:=0,当j<m时,更新(将j增加1),执行-
返回dfs(grid,sx,sy,ex,ey,空)
让我们看下面的实现以更好地理解-
示例
#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