在二维网格 grid 上,有 4 种类型的方格:
1 表示起始方格。且只有一个起始方格。 2 表示结束方格,且只有一个结束方格。
0 表示我们可以走过的空方格。
-1 表示我们无法跨越的障碍。
返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目,每一个无障碍方格都要通过一次。
例子:
输入:[[1,0,0,0],[0,0,0,0],[0,0,2,-1]]
输出:2
解释:我们有以下两条路径:
1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2)
2. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2)
解题思路:深度优先遍历+回溯
void back_trace(vector<vector<int>>& grid, int start_x, int start_y,
int non_obstacles, int & paths)
{
int m = grid.size();
int n = grid[0].size();
if(start_x<0 || start_x>=m || // 越界
start_y<0 || start_y>=n || // 越界
grid[start_x][start_y] == -1) // 障碍
return;
if (grid[start_x][start_y] == 2) // 到达终点
{
if (!non_obstacles) // 走过了所有非障碍节点
paths++;
return;
}
// 没有达到终点,也没有越界和遇到障碍
non_obstacles--; // 需要走过的非障碍节点减少一个
grid[start_x][start_y] = -1; // 将当前节点设置成障碍,说明已经走过,设成不可通行
// 然后依次在四个方向去遍历
back_trace(grid, start_x+1, start_y, non_obstacles, paths); // 上
back_trace(grid, start_x-1, start_y, non_obstacles, paths); // 下
back_trace(grid, start_x, start_y-1, non_obstacles, paths); // 左
back_trace(grid, start_x, start_y+1, non_obstacles, paths); // 右
grid[start_x][start_y] = 0; // 将当前点重新赋值回来,设成可通行
}
int uniquePathsIII(vector<vector<int>>& grid) {
int start_x, start_y; // 找到起点位置
int non_obstacles = 0; // 路径长度,等于0表示走过所有的非障碍点
int m = grid.size();
int n = grid[0].size();
for(int i=0; i<m; ++i){
for(int j=0; j<n; ++j){
if (grid[i][j] == 1)
{
start_x = i;
start_y = j;
}
else if(grid[i][j] != -1)
{
non_obstacles++;
}
}
}
int paths = 0; // paths
back_trace(grid, start_x, start_y, non_obstacles, paths);
return paths;
}
欢迎交流,批评指正;如果觉得对你有用,赏杯水喝!