JZ-066-机器人的运动范围
机器人的运动范围
题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。
- 请问该机器人能够达到多少个格子?
题目链接: 机器人的运动范围
代码
/**
* 标题:机器人的运动范围
* 题目描述
* 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位
* 之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。
* 请问该机器人能够达到多少个格子?
* 题目链接:
* https://www.nowcoder.com/practice/6e5207314b5241fb83f2329e89fdecc8?tpId=13&&tqId=11219&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
*/
public class Jz66 {
private static final int[][] next = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
private int cnt = 0;
private int rows;
private int cols;
private int threshold;
private int[][] digitSum;
/**
* 深度优先搜索(Depth First Search,DFS)
* 回溯是深度优先搜索的一种特例,它在一次搜索过程中需要设置一些本次搜索过程的局部状态,并在本次搜索结束之后清除状态。
* 而普通的深度优先搜索并不需要使用这些局部状态,虽然还是有可能设置一些全局状态。
*
* @param threshold
* @param rows
* @param cols
* @return
*/
public int movingCount(int threshold, int rows, int cols) {
this.rows = rows;
this.cols = cols;
this.threshold = threshold;
initDigitSum();
boolean[][] marked = new boolean[rows][cols];
dfs(marked, 0, 0);
return cnt;
}
private void dfs(boolean[][] marked, int r, int c) {
if (r < 0 || r >= rows || c < 0 || c >= cols || marked[r][c]) {
return;
}
marked[r][c] = true;
if (this.digitSum[r][c] > this.threshold) {
return;
}
cnt++;
for (int[] n : next) {
dfs(marked, r + n[0], c + n[1]);
}
}
private void initDigitSum() {
int[] digitSumOne = new int[Math.max(rows, cols)];
for (int i = 0; i < digitSumOne.length; i++) {
int n = i;
while (n > 0) {
digitSumOne[i] += n % 10;
n /= 10;
}
}
this.digitSum = new int[rows][cols];
for (int i = 0; i < this.rows; i++) {
for (int j = 0; j < this.cols; j++) {
this.digitSum[i][j] = digitSumOne[i] + digitSumOne[j];
}
}
}
public static void main(String[] args) {
Jz66 jz66 = new Jz66();
int i = jz66.movingCount(18, 20, 20);
System.out.println(i);
System.out.println(4 / 10);
}
}
【每日寄语】 人之初,性本善;性相近,习相远。
JZ-066-机器人的运动范围的更多相关文章
- 【Java】 剑指offer(12) 机器人的运动范围
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移 ...
- 《剑指offer》第十三题(机器人的运动范围)
// 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...
- Java实现 LeetCode 面试题13. 机器人的运动范围(DFS)
面试题13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动 ...
- 剑指 Offer 13. 机器人的运动范围 + 深搜 + 递归
剑指 Offer 13. 机器人的运动范围 题目链接 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2020/12/ ...
- 剑指 Offer 13. 机器人的运动范围
剑指 Offer 13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一 ...
- 机器人的运动范围 牛客网 剑指Offer
机器人的运动范围 牛客网 剑指Offer 题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大 ...
- 安卓手机与ROS通信遥控Gazebo中仿真机器人小车运动(ROS_indigo)
首先,先列出需要用到的一些文件: Gazebo中机器人模型及说明: http://wiki.ros.org/grizzly_simulator https://github.com/g/grizzly ...
- 剑指offer(66)机器人的运动范围
题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能 ...
- 剑指Offer 66. 机器人的运动范围 (回溯)
题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能 ...
- Scara机器人微分运动
两关节是Scara的典型结构,其运动学.逆运动学及微分运动计算简单,以下以两关节长度相等为条件进行运动学计算演示,l为杆件1,2长度,杆件1起点为基座零点: 一. 正运动学 其中 ...
随机推荐
- from 表单上传文件和下载?
from表单上传单个文件的方法. 分为三个部分,简单演示. 一部分 表单上传文件 <%-- Created by IntelliJ IDEA. User: Administrator Date: ...
- Collection和Map集合
前言 集合的长度是可变的.集合存储的都是对象.而且对象的类型可以不一致. Collection集合和Map集合是所有集合的父接口. Collection接口定义 体系结构的根接口,代表一组对象,有两个 ...
- python基础篇-爬虫urlparse使用及简单示例
>>> from urllib.parse import urlparse >>> o = urlparse('http://www.cwi.nl:80/%7Egu ...
- 收集有用的 Javascript 片段
内容目录 数组 arrayMax arrayMin chunk compact countOccurrences deepFlatten difference distinctValuesOfArra ...
- 将自己的web应用发布到Tomcat
方法一:(用这个方法最好先把ROOT文件夹备份好,不建议使用) 1,打开tomcat 的目录,在webapps 的目录下, 把命名为ROOT 的文件夹删掉, 然后把自己的war 包更名为 ROOT.w ...
- Python篇函数总结【输出函数】
1.raw_input("\n\nPress the enter key to exit.") 以上代码中 ,"\n\n"在结果输出前会输出两个新的空行.一旦用 ...
- VNCTF 2022 cm cm1 RE复现
cm1 安卓逆向 JEB 直接跟进主函数找到 ASSERT里面拿到ooo文件 直接脚本解密 k = "vn2022" with open('ooo', 'rb') as f: c ...
- C++ 实现 Parsec
前一段时间看到了梨梨喵聚聚写的Parser Combinator 在 C++ 里的 DSL, 感觉好厉害, 正好毕设里要写一部分前端, 昨天又把这篇文章看了一遍, 想着我也要用这么酷炫的东西来参与一下 ...
- 编译安装&打包压缩&定时任务
内容概要 编译安装 打包压缩 定时任务 内容详细 一.编译安装 1.特点 使用源代码,编译打包软件. 1.可以自定制软件 2.按需构建软件啊 2.步骤 下载安装包 wget 下载网址 如果没有 ...
- [LeetCode]9.回文数(Java)
原题地址: palindrome-number 题目描述: 给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数是指正序(从左向右)和倒序(从右向左)读都 ...