题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
算法思路
定义和方格大小一样的布尔值矩阵visited,用来标识路径是否已经到达过每个格子。
当首次到达某个格子(i,j)的时候,即visited[i*cols+j]==false,如果满足约束条件,计数加1并从该格出发,分别从四个方向进行移动;若该格已经被访问过或者不满足约束条件,返回0。
代码实现
class Solution {
private:
int nsteps;
public:
Solution(){
nsteps = 0;
}
int sum(int i, int j){
int s = 0;
while(i){
s += i%10;
i = i /10;
}
while(j){
s += j%10;
j = j /10;
}
return s;
}
int nCount(int i, int j, int threshold, int rows, int cols, bool* visited){
int index = i*cols+j;
if(i<0 || i>=rows || j<0 || j>=cols || sum(i,j)>threshold || visited[index])
return 0;
visited[index] = true;
return 1+nCount(i+1,j,threshold,rows,cols,visited)
+nCount(i-1,j,threshold,rows,cols,visited)
+nCount(i,j+1,threshold,rows,cols,visited)
+nCount(i,j-1,threshold,rows,cols,visited);
}
int movingCount(int threshold, int rows, int cols)
{
bool *visited = (bool*)malloc((rows*cols)*sizeof(bool));
for(int i = 0; i <rows*cols;++i)
visited[i] = false;
nsteps = nCount(0, 0, threshold, rows, cols, visited);
return nsteps;
}
};