文章目录
- 系列文章目录
- 一、一般性矩阵寻多种最短路径问题
- 传送门:各种迷宫寻路径问题(一)_躺平的小智的博客-CSDN博客
- 二、一般性迷宫问题 加强版
- 传送门:各种迷宫寻路径问题(二)_躺平的小智的博客-CSDN博客
- 三、一般性迷宫问题 加强版(二)
- 传送门:各种迷宫寻路径问题(三)_躺平的小智的博客-CSDN博客
- 四、有障碍,任意走的基础迷宫最短路径问题
- 传送门:各种迷宫问题(四)_躺平的小智的博客-CSDN博客
- 五、矩阵中寻找特殊元素路径
- 传送门:各种迷宫问题(五)_躺平的小智的博客-CSDN博客
- 六、矩阵中寻找特殊元素路径(二)
- 传送门:各种迷宫问题(六)_躺平的小智的博客-CSDN博客
- 七、美团力扣周赛
- 传送门:美团迷宫问题_躺平的小智的博客-CSDN博客
- 八、滴滴秋招笔试题
- 传送门:滴滴迷宫笔试题_躺平的小智的博客-CSDN博客
分析此题,题目中两个点是比较难的。
第一:起点不位于原点上,且终点也不在右下角,障碍物,可通过,起点,终点位置用数字表示
第二:每个无障碍方格都要通过一次,而且路径中不能有重复方格。
分析:
我们先解决起点、终点、空格数的问题,用for循环很容易能够求出来矩阵中的起点在哪,空格数的个数,这里我们空格数初始化要为1,因为起点虽然是1,但是他也是可通行路径。
这个题中路径也没有最小路径之说,所以我们此题用dfs,寻找满足要求的路径条数。
其次我们看路径中不能有重复方格,此题中因为此题障碍物都用-1表示,且损耗相同,所以我们没必要去创建一个vis矩阵去监督是否走过,我们直接另矩阵中走过的点0变成-1即可,回溯的时候我们再让-1变回0即可,同理,递归前count--,回溯时,count++。
最后我们再看我们的边界条件,那就是坐标位置不能大于小于矩阵的大小;截止条件为发现路径中的点为-1,或者走到终点了,空格数还不为0,意味着没有经过所有空格。结果我们用res去接受,满足一条路径,res++,别忘了res后面要加上return,继续递归,要不然找到一条路径后,可能就不找了,另答案出错。
代码如下:
class Solution {
public:
int res;
void dfs(vector<vector<int>>& grid,int m,int n,int count,int x,int y){
if(x<0||x>=m||y<0||y>=n||grid[x][y]==-1) return; //边界条件
if(grid[x][y]==2&&count!=0) return; //截止条件
if(grid[x][y]==2&&count==0){ //达到要求
res++;
return; //这里一定要加return回溯;
}
grid[x][y]=-1; //对经过的点赋值,表明走过了
count--;
dfs(grid,m,n,count,x+1,y);
dfs(grid,m,n,count,x-1,y);
dfs(grid,m,n,count,x,y+1);
dfs(grid,m,n,count,x,y-1);
count++; //回溯
grid[x][y]=0; //回溯
}
int uniquePathsIII(vector<vector<int>>& grid) {
res = 0; //记录几条满足要求的路径
int x0;
int y0;
int m = grid.size();
int n = grid[0].size();
int count =1; //起点也算是一个可以走过的方格,所以初始化为1
for(int i =0;i<m;++i){
for(int j =0;j<n;++j){
if(grid[i][j]==1){
x0 = i; //找到起点的坐标
y0 = j;
}
if(grid[i][j]==0) count++; //对空房个计数,题目要求为每个无障碍方格都要经过一次
}
}
dfs(grid,m,n,count,x0,y0);
return res;
}
};