在二维网格 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; // pathsback_trace(grid, start_x, start_y, non_obstacles, paths);return paths;}
欢迎交流,批评指正;如果觉得对你有用,赏杯水喝!

