题目描述:
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
题解:
class Solution {
public:
int n;
int m;
int thre;
vector<vector<bool>> vis;
int movingCount(int threshold, int rows, int cols)
{
if(rows == 0 || cols == 0)
return 0;
n = rows;
m = cols;
thre = threshold;
vis = vector<vector<bool>>(n,vector<bool>(m,false));
help(0,0);
int count = 0;
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
if(vis[i][j])
count++;
}
}
return count;
}
void help(int i,int j)
{
if(i<0||i>=n||j<0||j>=m||vis[i][j])
return;
int sum = 0;
int ti = i,tj = j;
while(ti > 0)
{
sum += (ti%10);
ti/=10;
}
while(tj > 0)
{
sum += (tj%10);
tj /=10;
}
if(sum > thre)
return;
vis[i][j] = true;
help(i-1,j);help(i+1,j);help(i,j-1);help(i,j+1);
}
};
解题思路:
用一个二维矩阵记录已经访问过的节点,已经访问的节点不再访问。
对于在回溯递归中,坐标超出范围、已经访问过、行列坐标之和大于k,都是不能访问的,对于每一个可以访问的节点,对它的上下左右递归访问。