1. 题目
在二维网格 grid 上,有 4 种类型的方格:
- 1 表示起始方格。且只有一个起始方格。
- 2 表示结束方格,且只有一个结束方格。
- 0 表示我们可以走过的空方格。
- -1 表示我们无法跨越的障碍。
返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目,每一个无障碍方格都要通过一次。
提示:1 <= grid.length * grid[0].length <= 20
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-paths-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. DFS回溯
- 网格地图之类的DFS套路解题,不难
class Solution {int sx,sy,ex,ey;//起点终点坐标int m,n,steps = 0;vector<vector<int>> dir = {{-1,0},{1,0},{0,1},{0,-1}};
public:int uniquePathsIII(vector<vector<int>>& grid) {int i, j;m = grid.size(), n = grid[0].size();for(i = 0; i < m; ++i)for(j = 0; j < n; ++j){if(grid[i][j] != -1)steps++;//计算需要走的格子数if(grid[i][j] == 1)sx = i, sy = j;//起点else if(grid[i][j] == 2)ex = i, ey = j;//终点}int paths = 0;grid[sx][sy] = -1;//起点标记走过了dfs(grid, sx, sy, 1, paths);return paths;}void dfs(vector<vector<int>>& grid, int x, int y, int step, int &paths) {if(x == ex && y == ey)//终点{if(step == steps)//走过所有的地方paths++;//方案+1return;}int x0, y0, origin;for(int k = 0; k < 4; ++k){x0 = x+dir[k][0];y0 = y+dir[k][1];//周围四个方向坐标if(x0 >= 0 && x0 < m && y0 >= 0 && y0 < n && grid[x0][y0] != -1){ //坐标未出界,且没有访问过origin = grid[x0][y0];//位置原始信息grid[x0][y0] = -1;//访问过了dfs(grid,x0,y0,step+1,paths);//dfsgrid[x0][y0] = origin;//回溯,恢复现场}}}
};