机器人的运动范围

机器人的运动范围

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

这中类型的题主要是考察 图搜索,一般都是用类似 dfs,bfs 的尝试算法,其实某种程度上算是穷举法,这个比直接暴力可能要节约一点时间,但是dfs的递归调用栈内存也是不好扛的。,,虽然一开始我是想用 bfs 的,但是发现还要用个数据结构来存每一层的点的坐标。所以写成 dfs,,,,可能有点晕,,,把 bfs 改成 dfs 就好理解了。https://blog.csdn.net/yinchaoji_/article/details/51264837 贴一个4年前的我的一篇博文(chaode)....,现在来理解比当时理解肯定要深刻些,,,

    public int movingCount(int threshold, int rows, int cols) {
        if(rows < 0 || cols<0){
            return 0;
        }
        int [] book=new int [rows*cols]; //用一个一维数组做逻辑索引
        int x=0;
        int y=0;
        int res=0;
        bfs(book,x,y,rows,cols,threshold);
        for(int i=0;i<book.length;i++){
            if(book[i]==1){
                res+=1;
            }
        }
        return res;
    }

    public void bfs(int [] book,int x ,int y ,int rows,int cols,int k){ //核心
        while(x>=0 && x<rows && y<cols && y>=0){
            int mark=x*cols+y; //获得逻辑索引位置
            int limit=getLimit(x,y);//获得限制的判断
            if(book[mark]==0 && limit<=k){ //此点满足条件的才可以进行下一个点的着***ook[mark]=1;
                bfs(book,x+1,y,rows,cols,k);
                bfs(book,x-1,y,rows,cols,k);
                bfs(book,x,y+1,rows,cols,k);
                bfs(book,x,y-1,rows,cols,k);
            }else { // 不满足的,打回,,因为这个点都到不了,这个点的下一个点肯定也是到不了的
                return;
            }
        }
        return ;
    }

    public int getLimit(int x ,int y ){
        return getNumsSum(x)+getNumsSum(y);
    }

    public int getNumsSum(int x){ //求数位和
        int sum=0;
        int y =0;
        while(x%10!=0){
            y=x%10;
            x=x/10;
            sum+=y;
        }
        return sum;
    }
全部评论

相关推荐

投递腾讯等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务