题目
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
本质就是一个dfs问题
直接上代码
class Solution {
public:
int sum(int x)
{
int num=0;
while(x!=0)
{
num+=x%10;
x/=10;
}
return num;
}
//judg判断这个点是不是符合要求
bool judg(int x,int y,int hold)
{
if(sum(x)+sum(y)<=hold)
return true;
else
return false;
}
int Step(int i,int j,int rows,int cols,bool *flag,int hold)
{
int index=i*cols+j;//要访问的下标
//下标映射出错了,查了半天呢还,cols是列数
if(i<0||j<0||flag[index]==true||i>=rows||j>=cols||judg(i,j,hold)==false)
return 0;
flag[index]=true;
//这个flag不需要在后面复制为false,因为如下所示,我们的递归调用是
//在这个点的上下左右四个方向都进行探索,既然我每一个点都是这样的方
//式去走,那递归回去也没有意义,如果递归回去只会让这个点被走多次这
//样最后的结果就会变得很大
int cnt=1;
cnt+=Step(i+1,j,rows,cols,flag,hold)+
Step(i-1,j,rows,cols,flag,hold)+
Step(i,j+1,rows,cols,flag,hold)+
Step(i,j-1,rows,cols,flag,hold);
return cnt;
}
int movingCount(int hold, int rows, int cols)
{
bool *flag=new bool[rows*cols];
for(int i=0;i<rows*cols;i++)
flag[i]=false;
int x=Step(0,0,rows,cols,flag,hold);
return x;
}
};