题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
class Solution {
public:
bool ifcanmove(int threshold,int r,int c,int rows, int cols){//判断一个位置是否能够到达
int he=0;
if(r<0||r>=rows||c<0||c>=cols) return false;
while(r!=0){
he=he+r%10;
r=r/10;
}
while(c!=0){
he=he+c%10;
c=c/10;
}
if(he<=threshold) return true;
return false;
}
void calnum(int **arr,int threshold,int r,int c,int rows,int cols){
if(ifcanmove(threshold,r,c,rows,cols)&&arr[r][c]==0){//当一个位置能够到达且之前没有到达过,就遍历它的四个邻域
arr[r][c]=1;
calnum(arr,threshold,r-1,c,rows,cols);
calnum(arr,threshold,r+1,c,rows,cols);
calnum(arr,threshold,r,c-1,rows,cols);
calnum(arr,threshold,r,c+1,rows,cols);
}
return;
}
int movingCount(int threshold, int rows, int cols)
{
int **arr=new int* [rows];
for(int i=0;i<rows;i++){
arr[i]=new int[cols];
}
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
arr[i][j]=0;//存放能否到达flag的数组
if(rows<=0||cols<=0) return 0;
calnum(arr, threshold, 0, 0, rows, cols);
int result=0;
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
if(arr[i][j]==1) result++;//通过遍历数组计算能到达的位置个数
return result;
}
};
方法二:
法一中最后需要再遍历一次数组,时间复杂度较高,因此乐意采用直接计算个数的方法。
class Solution {
public:
bool ifcanmove(int threshold,int r,int c,int rows, int cols){
int he=0;
if(r<0||r>=rows||c<0||c>=cols) return false;
while(r!=0){
he=he+r%10;
r=r/10;
}
while(c!=0){
he=he+c%10;
c=c/10;
}
if(he<=threshold) return true;
return false;
}
int calnum(int **arr,int threshold,int r,int c,int rows,int cols){
if(ifcanmove(threshold,r,c,rows,cols)&&arr[r][c]==0){
arr[r][c]=1;
return 1+calnum(arr,threshold,r-1,c,rows,cols)+
calnum(arr,threshold,r+1,c,rows,cols)+ calnum(arr,threshold,r,c-1,rows,cols)+
calnum(arr,threshold,r,c+1,rows,cols);
}
return 0;
}
int movingCount(int threshold, int rows, int cols)
{
int **arr=new int* [rows];
for(int i=0;i<rows;i++){
arr[i]=new int[cols];
}
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
arr[i][j]=0;
if(rows<=0||cols<=0) return 0;
int result=calnum(arr, threshold, 0, 0, rows, cols);
return result;
}
};