剑指offer-机器人的运动范围
题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
判断当前结点是否存在或者是否被访问过,没访问过就判断他是否合法(数位和大于k),合法的格子标记已访问,并递归其左右上下。
1 public class Solution {//回溯 dfs my 2 public int movingCount(int threshold, int rows, int cols) 3 { 4 boolean[][] isVisit = new boolean[rows][cols]; 5 dfs(threshold,0,0,isVisit); 6 int re =0; 7 for(int i=0;i<rows;i++){ 8 for(int j=0;j<cols;j++){ 9 if(isVisit[i][j]){ 10 re++; 11 } 12 } 13 } 14 return re; 15 } 16 public void dfs(int t,int x,int y,boolean[][] isVisit){ 17 if(x<0||y<0||x>=isVisit.length||y>=isVisit[0].length||isVisit[x][y]){ 18 return ; 19 } 20 int sum =0; 21 int i=x; 22 int j =y; 23 while(i!=0){ 24 sum+=i%10; 25 i/=10; 26 } 27 while(j!=0){ 28 sum+=j%10; 29 j/=10; 30 } 31 if(sum>t){ 32 return ; 33 } 34 isVisit[x][y] = true; 35 dfs(t,x+1,y,isVisit); 36 dfs(t,x-1,y,isVisit); 37 dfs(t,x,y+1,isVisit); 38 dfs(t,x,y-1,isVisit); 39 } 40 }