BFS求解腐烂的橘子

题目:

 分析:这道题其实就是求腐烂橘子到所有新鲜橘子的最短路径。直接用BFS遍历整个图,把所有新鲜的橘子都感染。

class Solution {
    public int orangesRotting(int[][] grid) {
        int row=grid.length; //行
        int col=grid[0].length; //列
        Queue<int []> queue=new LinkedList<>(); //存放腐烂橘子的队列
        int count=0; //记录新鲜橘子的数量
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(grid[i][j]==1) count++; //新鲜橘子
                if(grid[i][j]==2) queue.add(new int[]{i,j}); //腐烂橘子加入队列
            }
        }
        int res=0; //记录答案 也就是感染完的分钟数
        //还有新鲜橘子或者队列不为空就进行搜索感染
        while(count>0 && !queue.isEmpty()){
            res=res+1; //分钟数加1
            int size=queue.size();
            //开始遍历队列
            for(int i=0;i<size;i++){
                int [] coor=queue.poll(); //拿出一个腐烂橘子的坐标出来
                int r=coor[0]; //横坐标
                int c=coor[1]; //纵坐标
                //开始向四个方向遍历
                //上面
                if(r-1>=0 && grid[r-1][c]==1){
                    grid[r-1][c]=2; //感染上面橘子
                    queue.add(new int[]{r-1,c}); //感染橘子加入队列
                    count--; //新鲜橘子数目减1
                }
                //下面
               if(r+1<row && grid[r+1][c]==1){
                    grid[r+1][c]=2; //感染下面橘子
                    queue.add(new int[]{r+1,c});
                    count--; //新鲜橘子数目减1
                }
                //左边
                if(c-1>=0 && grid[r][c-1]==1){
                    grid[r][c-1]=2; //感染左边橘子
                    queue.add(new int[]{r,c-1});
                    count--; //新鲜橘子数目减1
                }
                //右边
                if(c+1<col && grid[r][c+1]==1){
                    grid[r][c+1]=2; 
                    queue.add(new int[]{r,c+1});
                    count--; 
                }
            }
        }
        //如果遍历完还要新鲜橘子数量就返回-1
        if(count>0){
            return -1;
        }else{
            return res;
        }
    }
}

 

©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页