目录

AcWing 24. 机器人的运动范围 C++ dfs(附上思路与思考&&注释)

发表于
0 1.6~2.1 分钟 733

请注意:本文只包含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;
}
};