题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
public class Solution {
public static void main(String[] args) {
System.out.println(new Solution().movingCount(5, 10, 10));
}
public int movingCount(int threshold, int rows, int cols) {
if (rows <= 0 || cols <= 0) {
return 0;
}
/*
* 记录是否已访问过
*/
int[] flag = new int[rows * cols];
return movingCountCore(threshold, rows, cols, 0, 0, flag);
}
public int movingCountCore(int threshold, int rows, int cols, int i, int j,
int[] flag) {
int index = i * cols + j;
/*
* 搜索边界
*/
if (index >= cols * rows || i < 0 || i >= rows || j < 0 || j >= cols
|| flag[index] == 1 || getdigits(i, j) > threshold) {
return 0;
}
flag[index] = 1;
/*
* 前后左右四个方向搜索
*/
return 1 + movingCountCore(threshold, rows, cols, i, j + 1, flag)
+ movingCountCore(threshold, rows, cols, i + 1, j, flag)
+ movingCountCore(threshold, rows, cols, i, j - 1, flag)
+ movingCountCore(threshold, rows, cols, i - 1, j, flag);
}
/*
* 计算位数 和
*/
public int getdigits(int i, int j) {
int num = 0;
String s = i + "" + j;
int len = s.length();
for (int k = 0; k < len; k++) {
num += Integer.parseInt(s.substring(k, k + 1));
}
return num;
}
}