地上有一个矩阵方格。
- 一从坐标0,0的开始移动,每一次只能向左,右,上,下四个方向移动一格,
- 但是不能进入行坐标和列坐标的数位之和大于k的位置。
- 当k=18时,能够进入(35,37),因为3+5+3+7 = 18。
- 它不能进入(35,38),因为3+5+3+8 = 19。
求一共可以访问的坐标数目
思路:设置一个visit访问数组,从(0,0)开始
每遇到一个节点,设置为已访问
同时判断4方向能够进入(即满足未被访问,坐标符合要求)
深度搜索结束后,统计visit=true的坐标数目即为运动的范围大小
——该题目相对于一般性的DFS深度搜索区别在于 visit数组访问后在递归返回前 不用改回
(因为是统计总大小,而不是搜索一种条件路径)
class Solution {
public:
int max;
int rows;
int cols;
vector<bool> visit;
int movingCount(int threshold, int rows, int cols)
{
max=threshold;
this->rows=rows;
this->cols=cols;
for(int i=0;i<rows*cols;i++)
visit.push_back(false);
if(can_in(0,0,max))
DFS(0,0);//从0 0开始
int res=0;//返回总共被访问的点数
for(int i=0;i<rows*cols;i++)
if(visit[i])
res++;
return res;
}
//该函数,当访问到点 (row,col)时,返回由该点出发所能到达的格子数目
void DFS(int row,int col)
{
visit[row*cols+col]=true;//访问该格子
if(row-1>=0 && can_in(row-1,col,max) && !visit[(row-1)*cols+col])
DFS(row-1,col);
if(row+1<rows && can_in(row+1,col,max) && !visit[(row+1)*cols+col])
DFS(row+1,col);
if(col-1>=0 && can_in(row,col-1,max)&& !visit[row*cols+col-1])
DFS(row,col-1);
if(col+1<cols && can_in(row,col+1,max)&& !visit[row*cols+col+1])
DFS(row,col+1);
}
bool can_in(int row,int col,int threshold)//返回坐标是否符合要求
{
int res=0;
while(row) //每次取最小一位
{
res+=row%10;
row=row/10;
}
while(col) //每次取最小一位
{
res+=col%10;
col=col/10;
}
if(res<=threshold)
return true;
else
return false;
}
};