
在二维网格 grid 上,有 4 种类型的方格:
返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目,每一个无障碍方格都要通过一次。
提示:1 <= grid.length * grid[0].length <= 20

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/unique-paths-iii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
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++;//方案+1
return;
}
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);//dfs
grid[x0][y0] = origin;//回溯,恢复现场
}
}
}
};