图的深度优先遍历和广度优先遍历

解题思路

关于图的深度优先遍历和广度优先遍历
为了标识出已经访问的路径,需要用到 hash
在DFS中需要记住如果能够访问 cnt=1

代码

class Solution {
public:
    bool isRed(int x,int y,int k )
    {
       // std::cout << x/10 + x%10 + y/10 + y%10 <<" " ;
       return  x/10 + x%10 + y/10 + y%10  > k   ;
     //   return (int(y/10) + (y%10)+int(x/10) + (x%10)>k ) ;
    }
    
    int dfs(int x,int y ,int width,int height, int k, std::vector<std::vector<int>>& visted )
    {
        if(x<0 || x>=width || y<0 || y >= height || visted[y][x] || isRed(x,y,k) ) return 0;
        int cnt=1;  //如果访问到则面积是1 
        visted[y][x] =1;
        cnt +=  dfs(x-1,y,width,height,k ,visted);
        cnt +=  dfs(x+1,y,width,height,k ,visted);
        cnt +=  dfs(x,y-1,width,height,k ,visted);
        cnt +=  dfs(x,y+1,width,height,k ,visted);
        return cnt;
    }

    int bfs(int x,int y ,int width,int height, int k, std::vector<std::vector<int>>& visted )
    {
        std::deque<std::pair<int,int>> q;

        q.emplace_back(x,y);
        int res=0;

        while(!q.empty())
        {

            auto node= q.front();q.pop_front();
            int tX= node.first, tY= node.second;
           // std::cout << tX <<" " << tY << std::endl;
            if(tX<0 || tX>=width ||tY<0 || tY >= height || visted[tY][tX] || isRed(tX,tY,k) )  continue;
            res++;
            visted[tY][tX]= 1;

            q.emplace_back(tX-1,tY);
            q.emplace_back(tX+1,tY);
            q.emplace_back(tX,tY-1);
            q.emplace_back(tX,tY+1);
        }

        return res;

    }
    

    int movingCount(int m, int n, int k) {

        //  0 <= x y <=99 
        //dfs   retuen area
        // end condition xy out of box, visted , isRed
        //   dfs(上下左右)  
        std::vector<std::vector<int>> visted(m,std::vector<int>(n,0) );
        //return dfs(0,0,n,m, k,visted);

        //bfs

        return bfs(0,0,n,m, k,visted);

        
        

         
    }
};

题目描述

剑指 Offer 13. 机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

示例 1:

输入:m = 2, n = 3, k = 1
输出:3
示例 2:

输入:m = 3, n = 1, k = 0
输出:1
提示:

1 <= n,m <= 100
0 <= k <= 20

posted @ 2021-05-18 09:34  boyang987  阅读(52)  评论(0编辑  收藏  举报