Java实现机器人的运动范围
来源:互联网 发布:sql数据库管理工具 编辑:程序博客网 时间:2024/06/07 01:58
题目描述:机器人的运动范围 地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每次可以向左,向右,向上,向下移动一格, 但不能进入行坐标和列坐标的位数之和大于k的格子。例如:当k为18时,机器人能够进入方格(35,37), 因为3+5+3+7 = 18;但它不能进入方格(35,38),因为3 + 5+3+8 = 19.请问该机器人最多能到达多少个格子?
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步
阅读全文
0 0
- 机器人的运动范围(Java实现)
- Java实现机器人的运动范围
- 机器人的运动范围java实现
- java-机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 机器人的运动范围
- 1877: [SDOI2009]晨跑
- java中的反射简单理解
- bat删除指定时间之前文件
- Hibernate笔记
- 简单制作进度条,圆弧
- Java实现机器人的运动范围
- 关于Android的一些杂项
- jpg/png/psd/tiff图片格式详解
- TensorFlow实战:手写数字识别之K近邻
- 2017上半年总结
- volatile关键字解析
- PHP中String类型
- HTML:a标签中href属性总结
- #学志#项目进度04