回溯问题模版(套路)https://labuladong.gitbook.io/algo/suan-fa-si-wei-xi-lie/3.1-hui-su-suan-fa-dfs-suan-fa-pian/hui-su-suan-fa-xiang-jie-xiu-ding-ban

def backtrack(路径, 选择列表):
  if 满足结束条件:
    result.add(路径)
    return

  for 选择 in 选择列表:
    做选择
    backtrack(路径, 选择列表)
    撤销选择

 

参考:

https://labuladong.gitbook.io/algo/suan-fa-si-wei-xi-lie/3.1-hui-su-suan-fa-dfs-suan-fa-pian/hui-su-suan-fa-xiang-jie-xiu-ding-ban

 

//典型回溯

题目描述

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
示例1

输入

复制
5,10,10

返回值

复制
21
class Solution {
public:
   
    void backtrace(int threshold, int rows, int cols,int i,int j,vector<vector<int>> dirs){
        if(i >= rows || j >= cols || i<0 || j<0 || isVisted[i][j])
            return;
        //数位之和
        int tmpi = i,tmpj = j,sum = 0;
        while(tmpi){
            sum += tmpi%10;
            tmpi /= 10;
        }
        while(tmpj){
            sum += tmpj%10;
            tmpj /= 10;
        }
        if(sum > threshold) return ;
        res++;
        isVisted[i][j] = true;
        for(int k=0;k<dirs.size();k++){
            backtrace(threshold,rows,cols,i+dirs[k][0],j+dirs[k][1],dirs);
        }
    }
    int movingCount(int threshold, int rows, int cols)
    {
        vector<vector<bool>> vis(rows,vector<bool>(cols,false));
        isVisted = vis;
        vector<vector<int>> dirs = {{0,1},{0,-1},{1,0},{-1,0}};
        backtrace(threshold,rows,cols,0,0,dirs);
        return res;
    }
public:
    int res =0;
    vector<vector<bool>> isVisted;
};

 

posted on 2020-12-20 11:13  wsw_seu  阅读(286)  评论(0编辑  收藏  举报

导航