心血来潮,看到很多很棒的题解博客,心想自己这几个月还没有好好地刷一遍剑指offer,每次都是从头刷,然而刷到三分之一处就坚持不下来了,希望这一次以此为契机,鼓励自己加油。前面的题目做过好多遍了,就从牛客网上的最后一题开始吧。
题目:
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
思路:
当机器人准备进入某一个格子时,首先用阈值和边界以及是否曾经被visit了来判定其是否可以进入,然后再判定其是否可以进入周围的4个格子,使用回溯算法。
程序代码:
(代码是很快完成了,因为一个数组越界的问题,困扰了半个小时,好在终于解决了)
class Solution {
public:
int movingCount(int threshold, int rows, int cols)
{
if(threshold<0 || rows<=0 || cols<=0)
return 0;
bool *visited=new bool[rows*cols];
for(int i=0;i<rows*cols;++i)
visited[i]=false;
int num=getPlace(threshold,rows,cols,0,0,visited);
//cout<<num<<endl;
delete[] visited;
return num;
}
int getPlace(int threshold,int rows,int cols,int row,int col,bool *visited)
{
int sumofCoordinate=0;
if(row<0 || row>=rows || col<0 || col>=cols)
return 0;
sumofCoordinate=getSum(row)+getSum(col);
int num=0;
if(row>=0 && col>=0 && row<=rows && col<=cols && sumofCoordinate<=threshold && visited[row*cols+col]==false)
{
visited[row*cols+col]=true;
num=1+getPlace(threshold,rows,cols,row+1,col,visited)
+getPlace(threshold,rows,cols,row,col+1,visited)
+getPlace(threshold,rows,cols,row-1,col,visited)
+getPlace(threshold,rows,cols,row,col-1,visited);
}
return num;
}
int getSum(int x)
{
int sum=0;
while(x%10 != x)
{
sum=sum+x%10;
x=x/10;
}
sum=sum+x;
return sum;
}
};
主程序:
int main()
{
Solution s;
int p=s.movingCount(3,4,4);
cout<<p<<endl;
}
运行结果: