腐烂的苹果_牛客题霸_牛客网
思路分析:广度优先遍历,找到所有腐烂的苹果同时向四方扩散,就是第一轮把所有腐烂的苹果加入队列中,这就跟MQ的消息队列的原理差不多,第一次记录队列的长度,广度遍历一次,长度--并且四周为1的苹果变为腐烂状态(不是变成2 而是将状态数组变成true),直到所有腐烂的苹果全部扩散完毕, 如果还有苹果的状态为1 return - 1
package study2.day5;import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;//dfs 求 腐烂的苹果
public class Test5 {public int rotApple (ArrayList<ArrayList<Integer>> grid) {int m = grid.size();int n = grid.get(0).size();boolean[][] vis = new boolean[m][n];//记录当前位置是否正在使用int[] dx = {0, 0, 1, -1};int ret = 0;int[] dy = {1, -1, 0, 0};//dx 和 dy 拼接成上下左右的坐标Queue<int[]> queue = new ArrayDeque<>();for (int i = 0; i < grid.size(); i++) {for (int j = 0; j < grid.get(i).size(); j++) {if (grid.get(i).get(j) == 2){queue.offer(new int[]{i, j});}}}while(!queue.isEmpty()){//队列不为空,就一次扩散,一次扩展全部腐烂的苹果int size = queue.size();while(size-- != 0){int[] t = queue.poll();int a = t[0], b = t[1];for (int i = 0; i < 4; i++) {int x = a + dx[i],y = b + dy[i];if (x >= 0 && y >= 0 && x < m && y < n && !vis[x][y] && grid.get(x).get(y) == 1){vis[x][y] = true;//腐蚀掉queue.offer(new int[]{x,y});//把被腐蚀掉的让他下一层再次扩展}}}ret++;}//判断还有不能被腐蚀的苹果for (int i = 0; i < grid.size(); i++) {vis[i] = new boolean[grid.get(i).size()];for (int j = 0; j < grid.get(i).size(); j++) {if (grid.get(i).get(j) == 1 && !vis[i][j]){return -1;}}}return ret - 1;}
}