剑指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 }
原文地址:https://www.cnblogs.com/zhacai/p/10711412.html