机器人的运动范围(Java实现)

来源:互联网 发布:js set to array 编辑:程序博客网 时间:2024/06/01 16:10

本题为剑指offer面试题67

测试链接:https://www.nowcoder.com/questionTerminal/6e5207314b5241fb83f2329e89fdecc8
来源:牛客网

[编程题]机器人的运动范围
  • 热度指数:28092  时间限制:1秒  空间限制:32768K
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?


Java Code:

package go.jacob.day616;public class Demo2 {public int movingCount(int threshold, int rows, int cols) {if (threshold < 0)return 0;boolean[] visited = new boolean[rows * cols];int count = movingCountCore(threshold, rows, cols, 0, 0, visited);return count;}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 - 1, col, visited)+ movingCountCore(threshold, rows, cols, row, col + 1, visited)+ movingCountCore(threshold, rows, cols, row, col - 1, visited);}return count;}/* * 判断数字是否满足条件 */private boolean check(int threshold, int rows, int cols, int row, int col, boolean[] visited) {if (row >= 0 && row < rows && col >= 0 && col < cols && visited[row * cols + col] == false&& getDigitSum(col) + getDigitSum(row) <= threshold)return true;return false;}/* * 获得数字的数位之和 */private int getDigitSum(int col) {int sum=0;while(col!=0){sum+=col%10;col=col/10;}return sum;}}


原创粉丝点击