描述
地上有一个rows行和cols列的方格。坐标从 [0,0] 到 [rows-1,cols-1]。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于threshold的格子。 例如,当threshold为18时,机器人能够进入方格[35,37],因为3+5+3+7 = 18。但是,它不能进入方格[35,38],因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
范围:
1 <= rows, cols<= 100
0 <= threshold <= 20
示例
输入:1,2,3
返回值:3
核心代码
public class Solution {
int count = 1;
int[][] direct = {{-1,0},{1,0},{0,-1},{0,1}};
public int movingCount(int threshold, int rows, int cols) {
if(rows == 0 || cols == 0) return 0;
int[][] arr = new int[rows][cols];
//全填充一
for(int i = 0;i < rows;i++){
for(int j = 0;j < cols;j++){
arr[i][j] = 1;
}
}
arr[0][0] = 0;
dfs(arr,threshold,0,0);
return count;
}
public void dfs(int[][] arr,int threshold,int i,int j){
int rows = arr.length;
int cols = arr[0].length;
if(i < 0 || i >= rows || j < 0 || j >= cols) return ;
for(int k = 0;k < 4;k++){
int x = direct[k][0] + i;
int y = direct[k][1] + j;
if(x >= 0 && x < rows && y >= 0 && y < cols && arr[x][y] == 1){
//该点存在,然后判断x,y的位数相加
int sum = 0;
int x1 = x,y1 = y;
while(x1 != 0){
sum += x1%10;
x1 /= 10;
}
while(y1 != 0){
sum += y1%10;
y1 /= 10;
}
if(sum > threshold){
arr[x][y] = 0;
}else{
count++;
arr[x][y] = 0;
dfs(arr,threshold,x,y);
}
}
}
}
}