public class E13RobotMovingRange {
//机器人从坐标(0,0)开始运动,计算坐标位数不大于k的可到达格数
public static int getMovingCount(int threshold, int rows, int cols) {
if (threshold < 0 || rows <= 0 || cols <= 0)
return 0;
//避免重复计算
boolean[] visited = new boolean[rows * cols];
return count(threshold, rows, cols, 0, 0, visited);
}
//计算可到达格数
private static int count(int threshold, int rows, int cols,
int row, int col, boolean[] visited) {
int count = 0;
if (check(threshold, rows, cols, row, col, visited)) {
visited[row * cols + col] = true;
count = 1 + count(threshold, rows, cols, row + 1, col, visited) +
count(threshold, rows, cols, row - 1, col, visited) +
count(threshold, rows, cols, row, col + 1, visited) +
count(threshold, rows, cols, row, col - 1, visited);
}
return count;
}
//判断某坐标是否可到达
private static boolean check(int threshold, int rows,
int cols, int row, int col, boolean[] visited) {
return row >= 0 && row < rows && col >= 0 && col < cols &&
checkCount(col) + checkCount(row) <= threshold && !visited[row * cols + col];
}
//计算某数字位数之和
private static int checkCount(int number) {
int count = 0;
while (number > 0) {
count += number % 10;
number /= 10;
}
return count;
}
//测试用例
public static void main(String[] args){
int count = E13RobotMovingRange.getMovingCount(2, 3, 3);
System.out.println(count);
/*
* 00 01 02
* 10 11 12
* 20 21 22
*/
}
}
机器人的运动范围(Java实现)
最新推荐文章于 2021-11-02 15:52:42 发布