《剑指offer》:[67]机器人的运动范围

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gogoky/article/details/51788291
题目:地上有个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》的作者何海涛老师,谢谢你的路过和陪伴!

     开心学习,学习开心!!

     《完》。


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页