《剑指offer》:[67]机器人的运动范围
2016-06-30 11:06
543 查看
题目:地上有个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。
例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7=18.但它不能进入方格(35,38),因为3+5+3+8=19.请问该机器人能够达到多少格子?
具体如下图所示:
例如我们输入的K=4,则机器人能够到达的格子数为:15。范围如上黄色区域所示。
方案:这个题目和前一个题目类似,我们采用回溯法。机器人从[0,0]格子开始移动,当它移动到下一个格子的时候,我们通过格子的数位来判断该机器人是否有权利进入,如果可以,格子数+1,我们再判断[i-1,j],[i,j-1][i+1,j],[i,j+1]这相邻的四个格子能否进入。
具体实现代码如下;
运行结果:
本来计划在20天内完成对《剑指offer》的阅读的,可是陆陆续续又花了一个月的时间,主要是博客写起来还是较费时的,虽然写的很烂。尽管不是第一次看,但是每次在写的时候又会有点儿新的感受,每天也只能抽出几个小时来完成,所以一个月又过去了。这样也慢慢的养成了一种写的习惯,这样的感觉还不错,可以监督自己每天抽时间看一点儿,进步一点儿,至少能看见自己 曾经走过的路。另外,这里还得小小吐槽一下CSDN,也是给其一个用户反馈及建议,我看网上论坛里也有人说到,那就是文章中有“敏感词”或者哪里有问题,用户在点击发表文章的时候,你可不可以提示一下,就一句”保存失败,稍后重试“,这样让用户如何定位错误?如何更改?如何......能不能有个提示啊!如果一句话可以解决一切问题,那还要这么多技术人员干什么,希望以后能多显示一个对话框和一句话,因为这不是能力问题,而是态度。虽然我只是个小小的用户,但是这个问题让我觉得实在是有些坑die啊,一个国家的发达先进与否不应该取决于老百姓的生活质量嘛!最主要的是我写的都是技术类博客,根本不涉及任何国家政治,经济,文化等相关的极端言论,希望这个“bug”能引起重视,因为真的真的很影响用户的体验!你们可能看不到,但我真心希望CSDN以后越来越好!请原谅文中语言的粗糙和图的不修边幅!
最后在此衷心感谢《剑指offer》的作者何海涛老师,谢谢你的路过和陪伴!
开心学习,学习开心!!
《完》。
例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7=18.但它不能进入方格(35,38),因为3+5+3+8=19.请问该机器人能够达到多少格子?
具体如下图所示:
例如我们输入的K=4,则机器人能够到达的格子数为:15。范围如上黄色区域所示。
方案:这个题目和前一个题目类似,我们采用回溯法。机器人从[0,0]格子开始移动,当它移动到下一个格子的时候,我们通过格子的数位来判断该机器人是否有权利进入,如果可以,格子数+1,我们再判断[i-1,j],[i,j-1][i+1,j],[i,j+1]这相邻的四个格子能否进入。
具体实现代码如下;
#include <iostream> using namespace std; int GetdigitSum(int number)//得到位数和; { int sum=0; while(number>0) { sum+=number%10; number/=10; } return sum; } bool check(int threshold,int rows,int cols,int col,int row,bool*visited) { if(row>=0 && row<rows && col>=0 && col<cols //是否越界; && GetdigitSum(row)+GetdigitSum(col)<=threshold//是否在threshold内; && !visited[row*cols+col])//是否已经访问; return true; return false; } int MoveCountHelp(int threshold,int rows,int cols,int row,int col, bool *visited) { int count =0; if(row>=0 && col>=0 &&row<rows && col<cols && !visited[row*cols+col] && GetdigitSum(row)+GetdigitSum(col)<=threshold) { visited[row*cols+col] = true; count = 1+MoveCountHelp(threshold,rows,cols,row+1,col,visited) //down +MoveCountHelp(threshold,rows,cols,row-1,col,visited) //up +MoveCountHelp(threshold,rows,cols,row,col+1,visited) //right +MoveCountHelp(threshold,rows,cols,row,col-1,visited); //left } return count; } int MoveCount(int threshold,int rows,int cols) { if(rows<1 || cols<1 ) return 0; bool *visited = new bool[rows*cols]; memset(visited,0,rows*cols); int count = MoveCountHelp(threshold,rows,cols,0,0,visited); delete []visited; return count; } int main() { int result=MoveCount(4,6,6); cout<<"当K等于4时,机器人能进入的格子数量为:"<<result<<endl; system("pause"); return 0; }
运行结果:
本来计划在20天内完成对《剑指offer》的阅读的,可是陆陆续续又花了一个月的时间,主要是博客写起来还是较费时的,虽然写的很烂。尽管不是第一次看,但是每次在写的时候又会有点儿新的感受,每天也只能抽出几个小时来完成,所以一个月又过去了。这样也慢慢的养成了一种写的习惯,这样的感觉还不错,可以监督自己每天抽时间看一点儿,进步一点儿,至少能看见自己 曾经走过的路。另外,这里还得小小吐槽一下CSDN,也是给其一个用户反馈及建议,我看网上论坛里也有人说到,那就是文章中有“敏感词”或者哪里有问题,用户在点击发表文章的时候,你可不可以提示一下,就一句”保存失败,稍后重试“,这样让用户如何定位错误?如何更改?如何......能不能有个提示啊!如果一句话可以解决一切问题,那还要这么多技术人员干什么,希望以后能多显示一个对话框和一句话,因为这不是能力问题,而是态度。虽然我只是个小小的用户,但是这个问题让我觉得实在是有些坑die啊,一个国家的发达先进与否不应该取决于老百姓的生活质量嘛!最主要的是我写的都是技术类博客,根本不涉及任何国家政治,经济,文化等相关的极端言论,希望这个“bug”能引起重视,因为真的真的很影响用户的体验!你们可能看不到,但我真心希望CSDN以后越来越好!请原谅文中语言的粗糙和图的不修边幅!
最后在此衷心感谢《剑指offer》的作者何海涛老师,谢谢你的路过和陪伴!
开心学习,学习开心!!
《完》。
相关文章推荐
- freemark和bootstrap中页面布局,页签,左右菜单
- CSS从大图中抠取小图完整教程(background-position应用)
- 关于JS中;window.onerror=function(){return!0};的错误
- HTML文件、PHP文件、JSON文件之间通过AJAX编程简单传递数据
- JavaScript高级程序设计知识点汇总
- js字符串
- 浅谈js和css内联外联注意事项
- 将sass压缩成css
- HTML新人基础学习1.4—添加常用的标签
- js函数
- js数组,个人总结
- JAVA-BufferedWriter写入文件没有内容
- 《一篇文章全吃透》—YYModel的使用技巧
- js设计模式
- js传值后台中文出现乱码的解决方法
- js控制textarea文本域自适应高度
- jQuery绑定自定义事件的魔法升级版
- Caffe
- js方法中的this
- js实现倒计时功能