美团迷宫问题

    文章目录

分析此题,题目中两个点是比较难的。

第一:起点不位于原点上,且终点也不在右下角,障碍物,可通过,起点,终点位置用数字表示

第二:每个无障碍方格都要通过一次,而且路径中不能有重复方格。

分析:

我们先解决起点、终点、空格数的问题,用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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥也不会的小白123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值