JZ12-题解 | #机器人的运动范围#

机器人的运动范围

http://www.nowcoder.com/practice/6e5207314b5241fb83f2329e89fdecc8

题目描述


地上有一个 rows 行和 cols 列的方格。坐标从 [0,0] 到 [rows-1,cols-1] 。一个机器人从坐标 [0,0] 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 threshold 的格子。 例如,当 threshold 为 18 时,机器人能够进入方格 [35,37] ,因为 3+5+3+7 = 18。但是,它不能进入方格 [35,38] ,因为 3+5+3+8 = 19 。请问该机器人能够达到多少个格子?


题解:DFS遍历(不撞南墙不回头)


算法思路:

  1. 由于给出了矩阵入口,因此不需要寻找递归入口
  2. 需要辅助数组记录已经走过的路径。
  3. 需要一个求数位和的方法。

图示(来自牛客题霸)

alt


代码

class Solution {
public:
    //数位和函数
    int getsum(int num){
        int sum = 0;
        while(num>0){
            sum+=num%10;
            num/=10;
        }
        return sum;
    }

    //    dfs深度优先搜索
    void dfs(int threshold,int& result, int row, int col,int rows, int cols,vector< vector<bool>> &visited){
        //递归出口
        if(row<0 || col<0 || row > rows-1 || col>cols-1)
            return;
        if(visited[row][col] == true || (getsum(row)+getsum(col))>threshold)
            return;
        //满足条件
        visited[row][col] =true;
        result++;
        //分别递归
        dfs(threshold,result,row+1,col,rows,cols,visited);
        dfs(threshold,result,row-1,col,rows,cols,visited);
        dfs(threshold,result,row,col+1,rows,cols,visited);
        dfs(threshold,result,row,col-1,rows,cols,visited);
    }

    int movingCount(int threshold, int rows, int cols) {
        int result = 0;
        //辅助数组
        vector< vector<bool> > visited(rows, vector<bool>(cols, false));
        dfs(threshold,result,0,0,rows,cols,visited);
        return result;
    }
};

题解2:BFS广度优先遍历


算法思路: BFS/DFS : 两者目标都是遍历整个矩阵,不同点在于搜索顺序不同。DFS 是朝一个方向走到底,再回退,以此类推;BFS 则是按照“平推”的方式向前搜索。 BFS 实现: 通常利用队列实现广度优先遍历。

全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务