请注意:本文只包含dfs的内容 /如有错误或者意见,欢迎留言
- 总体思路
模拟机器人走路,在符合条件的情况下,上下左右走,走到符合条件的格子,标记/累加。走完即可。
-
条件的判定
1.越界情况,x,y的值得在符合二维数组范围的情况下进行
2.走过的点,不需要累加/标记
3.x,y坐标相加是否大于k的时 -
dfs参数选择
最近看到一条定理:一直在变化的数,就可以用于dfs的参数。
这里我选择了,x,y坐标的值作为dfs的参数 -
小思考(没有尝试过,成功的小伙伴留言一下下)
是否可以直接遍历出x,y相加的值,
记录于二维数组中,
从而直接得出答案(没试过);
提示:不能直接判断哦,看清楚上下左右;
- 代码
class Solution {
public:
int k,row,col; //row代表行,col代表列
int n; //用于答案计数
int a[100][100];
int movingCount(int threshold, int rows, int cols)
{
memset(a,0,sizeof(a));
k=threshold,row=rows,col=cols;
dfs(0,0);
return n;
}
int he(int x,int y) //用于计算x,y的和(题意中的和)
{
int res=0;
while(x)
{
res+=x%10;
x/=10;
}
while(y)
{
res+=y%10;
y/=10;
}
return res;
}
void dfs(int x,int y)
{
if(x<0||y<0||x>=row||y>=col) return; //边界判定
if(a[x][y]==1) return; //是否已经走过这个点
if(he(x,y)>k) return; //如果x+y大于k的话(不符合条件)
//剩下的符合条件的情况 的操作
a[x][y]=1;
n++;
dfs(x-1,y); //上
dfs(x+1,y); //下
dfs(x,y-1); //左
dfs(x,y+1); //右
return;
}
};