二维数组广度优先遍历-腐烂的苹果

一、问题描述

二、解题思路

此问题通过广度优先遍历来解决,模拟苹果发霉变坏的过程

        1.初始时遍历网格,借助队列来储存所有发霉的苹果,统计好苹果个数

        2.每一分钟队列内发霉苹果都会对周围的苹果起作用(向外部扩散),所以把队列内所有发霉苹果依次弹出,对每个弹出的发霉苹果四周进行判断,传染健康苹果,然后把传染的健康苹果再次加入发霉队列中,这样就模拟了每一分钟的向外扩散过程。

        3.只要还有好苹果并且发霉列表内不为空,就重复执行上述操作(每次重复,时间统计+1)。

        4.当好苹果数量为0时,说明全部扩散完成,返回上述统计的时间;当队列内发霉苹果数量为0,此时健康苹果数量不是0时,意味着好苹果被空格隔离起来了,永远不会变质,则返回-1。

三、代码实现

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型ArrayList<ArrayList<>> 
     * @return int整型
     */
    public int rotApple (ArrayList<ArrayList<Integer>> grid) {
        int useTime=0;
        int healthyApple=0;
        //对应上下左右坐标变换
        int[] dx={0,0,-1,1};
        int[] dy={1,-1,0,0};

        int n=grid.size(),m=grid.get(0).size();

        //设置队列,存储发霉苹果
        Queue<int[]> appleQue=new LinkedList<>();

        //统计发霉苹果和健康苹果
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(grid.get(i).get(j)==2){
                    appleQue.offer(new int[]{i,j});
                }else if(grid.get(i).get(j)==1){
                    healthyApple++;
                }
            }
        }

        //从队列中弹出发霉水果,看是否会影响到周围,模拟传播过程,更新健康苹果数量
        //如果不再产生影响(队列为空),则证明完成传播过程
        //查看健康苹果个数是否为0,如果不是0则证明永远不会发霉,返回-1
        //如果是0则返回传播时间useTime
        while(healthyApple>0&&!appleQue.isEmpty()){
            useTime++;
            int badSize=appleQue.size();
            for(int i=0;i<badSize;i++){
                int[] nowidxArr=appleQue.poll();
                for(int j=0;j<dx.length;j++){
                    int x=nowidxArr[0]+dx[j];
                    int y=nowidxArr[1]+dy[j];
                    if(x>=0&&x<n&&y>=0&&y<m&&grid.get(x).get(y)==1){
                        grid.get(x).set(y,2);
                        healthyApple--;
                        appleQue.offer(new int[]{x,y});
                    }
                }
            }
        }
        if(healthyApple==0){
            return useTime;
        }else{
            return -1;
        }
    }
}

四、刷题链接

腐烂的苹果_牛客题霸_牛客网

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值