回溯问题模版(套路)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。请问该机器人能够达到多少个格子?
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; };