机器人的运动范围
地上有一个m行和n列的放个。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k=18时,机器人能够进入放个(35,37),因为3+5+3+7=18。但是,它不能进入放个(35,38),因为3+5+3+8=19.请问该机器人能够达到多少个格子?
题解:
利用回溯法进行方格查找:
代码如下:
class Solution {
public:
void findnum(const int threshold,const int rows,const int cols,int i,int j,int& len,bool* status){
int sum=0,temp=0;
int row=i,col=j;
while(sum!=temp+row%10+col%10){//判定数位相加之和
sum=temp+row%10+col%10;
row/=10;col/=10;
temp=sum;
}
if(sum>threshold) return;//判定数位和与与之大小
int num=0;
if(i>=0&&i<rows &&j>=0&&j<cols && status[i*cols+j]==0){
len++;
status[i*cols+j]=1;
//4邻域的方向延生
findnum(threshold,rows,cols,i-1,j,len,status);
findnum(threshold,rows,cols,i,j-1,len,status);
findnum(threshold,rows,cols,i+1,j,len,status);
findnum(threshold,rows,cols,i,j+1,len,status);
}
}
int movingCount(int threshold, int rows, int cols){
if(threshold<1||rows<1||cols<0) return 0;
bool status[rows*cols];//设置标志位
memset(status,0,rows*cols);
int len=0;
findnum(threshold,rows,cols,0,0,len,status);//起始点为0,0
return len;
}
};