1. // 面试题:机器人的运动范围
  2. // 题目:地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动,它
  3. // 每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和
  4. // 大于k的格子。例如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。
  5. // 但它不能进入方格(35, 38),因为3+5+3+8=19。请问该机器人能够到达多少个格子?
  6. #include <iostream>
  7.  
  8. int movingCountCore(int threshold, int rows, int cols, int row, int col, bool* visited);
  9. bool check(int threshold, int rows, int cols, int row, int col, bool* visited);
  10. int getDigitSum(int number);
  11.  
  12. int movingCount(int threshold, int rows, int cols)
  13. {
  14. if (threshold < || rows <= || cols <= )//每个值得检查的参数都应该被检查
  15. return ;
  16.  
  17. bool *visited = new bool[rows * cols];//用来检测这个点有没有走过
  18. for (int i = ; i < rows * cols; ++i)
  19. visited[i] = false;
  20.  
  21. int count = movingCountCore(threshold, rows, cols, , , visited);//从(0,0)开始检测
  22.  
  23. delete[] visited;
  24.  
  25. return count;
  26. }
  27.  
  28. int movingCountCore(int threshold, int rows, int cols, int row, int col, bool* visited)
  29. {
  30. int count = ;
  31. if (check(threshold, rows, cols, row, col, visited))//如果让走
  32. {
  33. visited[row * cols + col] = true;
  34.  
  35. count = + movingCountCore(threshold, rows, cols, row - , col, visited)
  36. + movingCountCore(threshold, rows, cols, row, col - , visited)
  37. + movingCountCore(threshold, rows, cols, row + , col, visited)
  38. + movingCountCore(threshold, rows, cols, row, col + , visited);//那就加上1并继续计算四邻点
  39. }
  40.  
  41. return count;
  42. }
  43.  
  44. bool check(int threshold, int rows, int cols, int row, int col, bool* visited)
  45. {
  46. if (row >= && row < rows && col >= && col < cols
  47. && getDigitSum(row) + getDigitSum(col) <= threshold
  48. && !visited[row* cols + col])//只有当满足边界条件,满足题设,并且没有走过的点才被允许
  49. return true;
  50.  
  51. return false;
  52. }
  53.  
  54. int getDigitSum(int number)
  55. {
  56. int sum = ;
  57. while (number > )//让我纳闷的是,居然要求值大于零
  58. {
  59. sum += number % ;
  60. number /= ;
  61. }
  62.  
  63. return sum;
  64. }
  65.  
  66. // ====================测试代码====================
  67. void test(const char* testName, int threshold, int rows, int cols, int expected)
  68. {
  69. if (testName != nullptr)
  70. printf("%s begins: ", testName);
  71.  
  72. if (movingCount(threshold, rows, cols) == expected)
  73. printf("Passed.\n");
  74. else
  75. printf("FAILED.\n");
  76. }
  77.  
  78. // 方格多行多列
  79. void test1()
  80. {
  81. test("Test1", , , , );
  82. }
  83.  
  84. // 方格多行多列
  85. void test2()
  86. {
  87. test("Test2", , , , );
  88. }
  89.  
  90. // 方格只有一行,机器人只能到达部分方格
  91. void test3()
  92. {
  93. test("Test3", , , , );
  94. }
  95.  
  96. // 方格只有一行,机器人能到达所有方格
  97. void test4()
  98. {
  99. test("Test4", , , , );
  100. }
  101.  
  102. // 方格只有一列,机器人只能到达部分方格
  103. void test5()
  104. {
  105. test("Test5", , , , );
  106. }
  107.  
  108. // 方格只有一列,机器人能到达所有方格
  109. void test6()
  110. {
  111. test("Test6", , , , );
  112. }
  113.  
  114. // 方格只有一行一列
  115. void test7()
  116. {
  117. test("Test7", , , , );
  118. }
  119.  
  120. // 方格只有一行一列
  121. void test8()
  122. {
  123. test("Test8", , , , );
  124. }
  125.  
  126. // 机器人不能进入任意一个方格
  127. void test9()
  128. {
  129. test("Test9", -, , , );
  130. }
  131.  
  132. int main(int agrc, char* argv[])
  133. {
  134. test1();
  135. test2();
  136. test3();
  137. test4();
  138. test5();
  139. test6();
  140. test7();
  141. test8();
  142. test9();
  143. system("pause");
  144. return ;
  145. }

《剑指offer》第十三题(机器人的运动范围)的更多相关文章

  1. 【剑指Offer】66、机器人的运动范围

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

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

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

  3. 《剑指offer》刷题目录

    <剑指offer>刷题目录 面试题03. 数组中重复的数字 面试题04. 二维数组中的查找 面试题05. 替换空格 面试题06. 从尾到头打印链表 面试题07. 重建二叉树 面试题09. ...

  4. 浅谈《剑指offer》原题:不使用条件、循环语句求1+2+……+n

    转载自:浅谈<剑指offer>原题:求1+2+--+n 如侵犯您的版权,请联系:windeal12@qq.com <剑指offer>上的一道原题,求1+2+--+n,要求不能使 ...

  5. 《剑指offer》算法题第十二天

    今天是<剑指offer>算法题系列的最后一天了,但是这个系列并没有包括书上的所有题目,因为正如第一天所说,这些代码是在牛客网上写并且测试的,但是牛客网上并没有涵盖书上所有的题目. 今日题目 ...

  6. 《剑指offer》刷题笔记

    简介 此笔记为我在 leetcode 上的<剑指offer>专题刷题时的笔记整理. 在刷题时我尝试了 leetcode 上热门题解中的多种方法,这些不同方法的实现都列在了笔记中. leet ...

  7. 《剑指Offer》附加题_用两个队列实现一个栈_C++版

    在<剑指Offer>中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即"用两个队列实现一个栈". 在计算机数据结构中,栈的特点是后进先出,即最后被压入(push ...

  8. 剑指offer 面试5题

    面试5题: 题目:请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 方法一: # -*- co ...

  9. 剑指offer 面试8题

    面试8题: 题目:二叉树的下一个节点 题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解题思路:详见剑 ...

  10. 剑指offer 面试10题

    面试10题: 题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39 n=0时,f(n)=0 n=1时,f(n)=1 n>1时,f(n)=f(n-1 ...

随机推荐

  1. jmeter bean shell断言加密的响应信息(加密接口测试二)

    断言加密的响应信息 1.在http请求-->添加-->断言-->bean shell 断言 import com.changfu.EncryptAndDecryptInterface ...

  2. 摘自(http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html)

    理解Linux系统负荷   作者: 阮一峰 一.查看系统负荷 如果你的电脑很慢,你或许想查看一下,它的工作量是否太大了. 在Linux系统中,我们一般使用uptime命令查看(w命令和top命令也行) ...

  3. ajax提交form(文本数据以及文件上传)

    $.ajax({ url: 'xxxx.do', type: 'POST', cache: false, data: new FormData($('.layui-form')[0]), proces ...

  4. Android (Android Studio)无法启动adb 解决方案

    打开cmd 输入:     netstat -aon|findstr "5037"      回车  taskkill /pid xxxx /f     ps:xxxx为占用端口 ...

  5. 百度地图api通过地址显示地图,白名单

    百度地图api通过地址显示地图,白名单 http://developer.baidu.com/map/jsdemo.htm#i7_1?qq-pf-to=pcqq.c2c---------------- ...

  6. spring中对象转json过滤(jackson)

    spring自带的json解析器是jackson jackson注解 @JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性. @JsonFormat 此注解用于属性上,作用是把 ...

  7. JavaScript中几种 获取元素的方式

    1.根据id获取元素 document.getElementById("id属性的值"); 2.根据标签名字获取元素 document.getElementsByTagName(& ...

  8. docker简单操作

    下载镜像docker pull httpd(镜像名) 查看镜像:docker images 做容器 docker run -ti -v(映射)/www:发布目录的路径 -p 80:80 --name ...

  9. Python中模块(Module)和包(Package)的区别

    本文绝大部分内容转载至:廖雪峰官方网站 1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函 ...

  10. devicePixelRatio手机图片模糊的原因

    一.移动设备图片模糊问题 手机上图片模糊问题原因就是一个像素在电脑上和手机上代表的实际像素的不同. 我们在样式表中使用的px(独立像素)单位其实并不一定代表着实际的一个像素(物理像素),这还要看硬件的 ...