DFS 求运动的范围

地上有一个矩阵方格。

  • 一从坐标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;
        
    }
    
    
};

猜你喜欢

转载自blog.csdn.net/qq_33369979/article/details/88536222
今日推荐