机器人的运动范围

题目描述

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。

  • 请问该机器人能够达到多少个格子?

题目链接: 机器人的运动范围

代码

  1. /**
  2. * 标题:机器人的运动范围
  3. * 题目描述
  4. * 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位
  5. * 之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。
  6. * 请问该机器人能够达到多少个格子?
  7. * 题目链接:
  8. * https://www.nowcoder.com/practice/6e5207314b5241fb83f2329e89fdecc8?tpId=13&&tqId=11219&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
  9. */
  10. public class Jz66 {
  11. private static final int[][] next = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
  12. private int cnt = 0;
  13. private int rows;
  14. private int cols;
  15. private int threshold;
  16. private int[][] digitSum;
  17. /**
  18. * 深度优先搜索(Depth First Search,DFS)
  19. * 回溯是深度优先搜索的一种特例,它在一次搜索过程中需要设置一些本次搜索过程的局部状态,并在本次搜索结束之后清除状态。
  20. * 而普通的深度优先搜索并不需要使用这些局部状态,虽然还是有可能设置一些全局状态。
  21. *
  22. * @param threshold
  23. * @param rows
  24. * @param cols
  25. * @return
  26. */
  27. public int movingCount(int threshold, int rows, int cols) {
  28. this.rows = rows;
  29. this.cols = cols;
  30. this.threshold = threshold;
  31. initDigitSum();
  32. boolean[][] marked = new boolean[rows][cols];
  33. dfs(marked, 0, 0);
  34. return cnt;
  35. }
  36. private void dfs(boolean[][] marked, int r, int c) {
  37. if (r < 0 || r >= rows || c < 0 || c >= cols || marked[r][c]) {
  38. return;
  39. }
  40. marked[r][c] = true;
  41. if (this.digitSum[r][c] > this.threshold) {
  42. return;
  43. }
  44. cnt++;
  45. for (int[] n : next) {
  46. dfs(marked, r + n[0], c + n[1]);
  47. }
  48. }
  49. private void initDigitSum() {
  50. int[] digitSumOne = new int[Math.max(rows, cols)];
  51. for (int i = 0; i < digitSumOne.length; i++) {
  52. int n = i;
  53. while (n > 0) {
  54. digitSumOne[i] += n % 10;
  55. n /= 10;
  56. }
  57. }
  58. this.digitSum = new int[rows][cols];
  59. for (int i = 0; i < this.rows; i++) {
  60. for (int j = 0; j < this.cols; j++) {
  61. this.digitSum[i][j] = digitSumOne[i] + digitSumOne[j];
  62. }
  63. }
  64. }
  65. public static void main(String[] args) {
  66. Jz66 jz66 = new Jz66();
  67. int i = jz66.movingCount(18, 20, 20);
  68. System.out.println(i);
  69. System.out.println(4 / 10);
  70. }
  71. }

【每日寄语】 人之初,性本善;性相近,习相远。

JZ-066-机器人的运动范围的更多相关文章

  1. 【Java】 剑指offer(12) 机器人的运动范围

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移 ...

  2. 《剑指offer》第十三题(机器人的运动范围)

    // 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...

  3. Java实现 LeetCode 面试题13. 机器人的运动范围(DFS)

    面试题13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动 ...

  4. 剑指 Offer 13. 机器人的运动范围 + 深搜 + 递归

    剑指 Offer 13. 机器人的运动范围 题目链接 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2020/12/ ...

  5. 剑指 Offer 13. 机器人的运动范围

    剑指 Offer 13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一 ...

  6. 机器人的运动范围 牛客网 剑指Offer

    机器人的运动范围 牛客网 剑指Offer 题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大 ...

  7. 安卓手机与ROS通信遥控Gazebo中仿真机器人小车运动(ROS_indigo)

    首先,先列出需要用到的一些文件: Gazebo中机器人模型及说明: http://wiki.ros.org/grizzly_simulator https://github.com/g/grizzly ...

  8. 剑指offer(66)机器人的运动范围

    题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能 ...

  9. 剑指Offer 66. 机器人的运动范围 (回溯)

    题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能 ...

  10. Scara机器人微分运动

    两关节是Scara的典型结构,其运动学.逆运动学及微分运动计算简单,以下以两关节长度相等为条件进行运动学计算演示,l为杆件1,2长度,杆件1起点为基座零点: 一.            正运动学 其中 ...

随机推荐

  1. 微服务架构 | 5.2 基于 Sentinel 的服务限流及熔断

    目录 前言 1. Sentinel 基础知识 1.1 Sentinel 的特性 1.2 Sentinel 的组成 1.3 Sentinel 控制台上的 9 个功能 1.4 Sentinel 工作原理 ...

  2. window-server 服务器解决远程连接

    mstsc 连接远程服务器,出现黑屏的情况: 解决方案: 运行 -> 输入gpedit.msc,进入组策略 -> 计算机配置 -> 管理模板 -> Windows组件 -> ...

  3. 如何在pyqt中使用 QStyle 重绘 QSlider

    前言 使用 qss 可以很方便地改变 QSlider 的样式,但是有些情况下 qss 无法满足我们的需求.比如下图所示样式: 如果直接使用 qss 将 handle 的内圆设置为透明背景,会看到 ha ...

  4. python--003 数据类型

    运算符 in "heilo" in "adfsdfsdfsdfsdfdsfdshellofsdfdsf" "li"  in ["l ...

  5. Java数组问题:Array constants can only be used in initializers

    感谢大佬:https://www.cnblogs.com/fanerwei222/p/11491571.html 感谢大佬:https://blog.csdn.net/weixin_42591732/ ...

  6. IM开发通信协议基础知识(一)---TCP、UDP、HTTP、SOCKET

    感谢大佬:https://www.cnblogs.com/sixindev/p/4723590.html 下面这些内容不了解也可以进行开发,深入了解一下还是收益良多 区别 TCP.UDP.HTTP.S ...

  7. uniapp自定义顶部搜索框兼容微信小程序

    zhuanzai:  uniapp自定义顶部搜索框兼容微信小程序 自定义组件 navbarvue (胶囊底部高度 - 状态栏的高度) + (胶囊顶部高度 - 状态栏内的高度) = 导航栏的高度 < ...

  8. 增删改查简单的sql语句

    insert INSERT   INTO    t_stu   (name,age)  VALUES  ('wang',12) INSERT INTO    t_stu   VALUES(NULL,' ...

  9. 直播媒体流red5

    第一步下载 安装setup-Red5-1.0.1-java6.exe 安装教程网上有很多 显示如下页面说明安装成功 第二步 下载oflaDemo的 解压放在 第三步  打开 然后 ok了 注意:下面的 ...

  10. 打印流(printStream)

    import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Pri ...