一、问题描述
二、解题思路
此问题通过广度优先遍历来解决,模拟苹果发霉变坏的过程
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;
}
}
}
四、刷题链接
腐烂的苹果_牛客题霸_牛客网