记忆搜索法

出界的路径数

普通dfs搜索法

  • 传入起始位置的坐标
  • 向四个方向进行搜索,如果出界了,计数器增加
  • 但是,这种方法因为许多重复搜索,会超时
class Solution {
public:
    void _findPaths(int m,int n,int x,int y,int maxMove,int &count,int sub,int num)
    {
        if(sub>maxMove)//步伐数超过了
            return;

        if(x<0||x>=m||y<0||y>=n)//越界了
        {
            count++;
            count%=num;
            return;
        }
        
        //四个方向进行搜索
        _findPaths(m,n,x+1,y,maxMove,count,sub+1,num);
        _findPaths(m,n,x-1,y,maxMove,count,sub+1,num);
        _findPaths(m,n,x,y+1,maxMove,count,sub+1,num);
        _findPaths(m,n,x,y-1,maxMove,count,sub+1,num);

    }
    int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
        int num=pow(10,9)+7;
        int count=0;
        _findPaths(m,n,startRow,startColumn,maxMove,count,0,num);
        return count;
    }
};

记忆搜索法

  • 将从每个位置出发,可以获得的出界数记录起来,这样在下次出现的时候,就不需要再进行搜索
  • 通过横纵坐标,以及当前的步伐数,进行定位,即给定一个三维数组进行定位
class Solution {
public:
long long _findPaths(int m,int n,int maxMove,int x,int y,int sub,vector<vector<vector<long long>>>&dp,int mod)
    {
        if(sub>maxMove)//超出步伐数
            return 0;
        if(x<0||x>=m||y<0||y>=n)//越界了
            return 1;
        if(dp[sub][x][y]!=-1)
            return dp[sub][x][y];
        
        return dp[sub][x][y]=
        (_findPaths(m,n,maxMove,x+1,y,sub+1,dp,mod)+
        _findPaths(m,n,maxMove,x-1,y,sub+1,dp,mod)+
        _findPaths(m,n,maxMove,x,y+1,sub+1,dp,mod)+
        _findPaths(m,n,maxMove,x,y-1,sub+1,dp,mod))%mod;
    }

    int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
        int mod=pow(10,9)+7;

        //dp[k][i][j] 表示在[i,j]位置,步伐为K时的次数
        vector<vector<vector<long long>>> dp(maxMove+1,vector<vector<long long>>(m,vector<long long>(n,-1)));
        return _findPaths(m,n,maxMove,startRow,startColumn,0,dp,mod);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值