机器人的运动范围
问题描述:地上有一个m行n列的方格, 一个机器人从坐标(0,0)的格子开始移动,它每次可以向左,向右,向上,向下移动一格, 但不能进入行坐标和列坐标的位数之和大于k的格子, 例如:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18; 但它不能进入方格(35,38),因为3 + 5+3+8 = 19.请问该机器人最多能到达多少个格子?
本方法思想:使用回溯法。如果可以进入本格子,则判断与它相邻的四个格子,具体见代码。
持续更新...
代码附下
Java实现:
package 机器人的运动范围;
/**
* 地上有一个m行n列的方格。
* 一个机器人从坐标(0,0)的格子开始移动,
* 它每次可以向左,向右,向上,向下移动一格,
* 但不能进入行坐标和列坐标的位数之和大于k的格子。
* 例如:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18;
* 但它不能进入方格(35,38),因为3 + 5+3+8 = 19.
* 请问该机器人最多能到达多少个格子?
* @author user
*回溯法:如果可以进入本格子,则判断与它相邻的四个格子
*/
public class Test {
public static int M = 20;
public static int N = 20;
public static int K = 18;
/**
* 开始程序
* @return
*/
public int moveStart() {
int m = M;
int n = N;
int k = K;
boolean isVisited[][] = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
isVisited[i][j] = false;
}
}
int count = moveCount(0, 0, k, isVisited);
return count;
}
/**
* 递归计数
*
* @param i行坐标
* @param j纵坐标
* @param k2
* @param isVisited
* @return
*/
private int moveCount(int i, int j, int k, boolean[][] isVisited) {
// TODO Auto-generated method stub
int count = 0;
int m = isVisited.length;
int n = isVisited[0].length;
if (i >= 0 && i < m && j >= 0 && j < n && !isVisited[i][j] && isSum(i, j, k)) {
isVisited[i][j] = true;
count = 1 + moveCount(i - 1, j, k, isVisited) + moveCount(i, j - 1, k, isVisited)
+ moveCount(i + 1, j, k, isVisited) + moveCount(i, j + 1, k, isVisited);
}
return count;
}
/**
* 判断【i,j】是否符合条件
*
* @param i
* @param j
* @param k
* @return
*/
private boolean isSum(int i, int j, int k) {
// TODO Auto-generated method stub
int sum = 0;
while (i > 0) {
sum = sum + i % 10;
i = i / 10;
}
while (j > 0) {
sum = sum + j % 10;
j = j / 10;
}
if (sum <= k) {
return true;
}
return false;
}
public static void main(String[] args) {
Test test = new Test();
int count = test.moveStart();
System.out.println(count);
}
}
持续更新...欢迎赞赏!
https://blog.csdn.net/ustcer_93lk/article/details/80369586
如果有问题,欢迎大家留言,有更好的方法也期待大家告知。