题目描述:
解法思路:
根据题目的意思,就是机器人从(0,0)出发,可以向上下左右走格子,目的地是(m-1,n-1),其中不能进入行坐标和列坐标之和大于k的格子,问这个小机器人最多能走几个格子?解决这道题最好的办法就是使用深度优先搜索(dfs)的办法。从起点出发,向四周走,当走出边界或者走到不符合规定的格子时,就回溯到上一个格子换成另一个方向。每走一个有效格子,记录一次。这样就能求出在m x n这片区域中,机器人能走过的所有格子数了。
但是后来发现,走四个方向的运行时间有点长。经过大佬的指点,发现只需要走右和下两个方向就够了。因为这里求的是区域,刚好起点在区域的左上角,只走右边和下边两个方向,就已经能覆盖整个区域了。这样也减少了许多重复的操作。
代码实现:
class Solution {
int m;
int n;
int[][] flag;
public int movingCount(int m, int n, int k) {
this.m=m;
this.n=n;
this.flag=new int[m][n];
return bianli(0,0,k);
}
int bianli(int i, int j, int k) {
if(i<0||i>=m||j<0||j>=n||sum(i,j)>k||flag[i][j]==1) return 0;
flag[i][j]=1;
int count=1;
return count+bianli(i+1,j,k)+bianli(i,j+1,k);
}
int sum(int m, int n){
int count=0;
while(m!=0){
count += m%10;
m /= 10;
}
while(n!=0){
count += n%10;
n /= 10;
}
return count;
}
}
执行结果: