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步
原创粉丝点击