您的位置:首页 > Web前端

《剑指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]这相邻的四个格子能否进入。

具体实现代码如下;
#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》的作者何海涛老师,谢谢你的路过和陪伴!

     开心学习,学习开心!!

     《完》。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: