Java实现机器人的运动范围
2017-07-03 11:15
435 查看
题目描述:机器人的运动范围 地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每次可以向左,向右,向上,向下移动一格, 但不能进入行坐标和列坐标的位数之和大于k的格子。例如:当k为18时,机器人能够进入方格(35,37), 因为3+5+3+7 = 18;但它不能进入方格(35,38),因为3 + 5+3+8 = 19.请问该机器人最多能到达多少个格子?
Java实现代码如下:
运行结果:
Java实现代码如下:
import java.util.Scanner; /** * * @author zhangjunying * */ public class MovingCount { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入限制条件k:"); int k = scanner.nextInt(); System.out.println("请输入方格的行数m:"); int m = scanner.nextInt(); System.out.println("请输入方格的列数n:"); int n = scanner.nextInt(); MovingCount count = new MovingCount(); int movingCount = count.movingCount(k, m, n); System.out.println("机器人走了:" + movingCount + "步"); } /** * 回溯算法 * * @param threshold * 约束值 * @param rows * 方格行数 * @param cols * 方格列数 * @return 最多可走的方格数 */ private int movingCount(int threshold, int rows, int cols) { if (threshold < 0 || rows <= 0 || cols <= 0) { return 0; } // 访问标识数组 boolean[] visited = new boolean[rows * cols]; // 全部置为false for (int i = 0; i < rows * cols; i++) { visited[i] = false; } int count = movingCountCore(threshold, rows, cols, 0, 0, visited); return count; } /** * 计算步数 * * @param threshold * @param rows * @param cols * @param row * @param col * @param visited * @return */ private int movingCountCore(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 + movingCountCore(threshold, rows, cols, row - 1, col, visited) + movingCountCore(threshold, rows, cols, row, col - 1, visited) + movingCountCore(threshold, rows, cols, row + 1, col, visited) + movingCountCore(threshold, rows, cols, row, col + 1, visited); } return count; } /** * 判断机器人能否进入坐标为(row,col)的方格 * * @param threshold * @param rows * @param cols * @param row * @param col * @param visited * @return */ private boolean check(int threshold, int rows, int cols, int row, int col, boolean[] visited) { if (row >= 0 && row < rows && col >= 0 && col < cols && getDigitSum(row) + getDigitSum(col) <= threshold && !visited[row * cols + col]) { return true; } return false; } /** * 得到一个数字的数位之和 * * @param number * 一个数字 * @return 数字的位数之和 */ private int getDigitSum(int number) { int sum = 0; while (number > 0) { sum += number % 10; number /= 10; } return sum; } }
运行结果:
请输入限制条件k: 4 请输入方格的行数m: 3 请输入方格的列数n: 3 机器人走了:9步
相关文章推荐
- 剑指Offer面试题67:机器人的运动范围 Java实现
- 机器人的运动范围(Java实现)
- 机器人的运动范围java实现
- java计算机器人的运动范围
- 《剑指offer》机器人的运动范围(java)
- 剑指offer-----机器人的运动范围 java
- 剑指offer-----机器人的运动范围(java版)
- java-机器人的运动范围
- 机器人的运动范围
- Java中如何实现单个线程范围内的数据共享
- Java_Swing实现小球沿正弦曲线运动的代码
- 【剑指Offer学习】【面试题67:机器人的运动范围】
- 《剑指Offer》学习笔记--面试题67:机器人的运动范围
- 机器人的运动范围
- java 面试题 请设计一个方法,可以实现获取任意范围内的随机数
- 剑指offer 67-机器人的运动范围
- 面试题67:机器人的运动范围
- 剑指offer--机器人的运动范围
- Top k问题的讨论(三种方法的java实现及适用范围)