首页 > 试题广场 >

腐烂的苹果

[编程题]腐烂的苹果
  • 热度指数:2786 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个 的网格,其中每个单元格中可能有三种值中的一个 0 , 1 , 2。
其中 0 表示这个格子为空、1 表示这个格子有一个完好的苹果,2 表示这个格子有一个腐烂的苹果。
腐烂的苹果每分钟会向上下左右四个方向的苹果传播一次病菌,并导致相邻的苹果腐烂。请问经过多少分钟,网格中不存在完好的苹果。如果有苹果永远不会腐烂则返回 -1。
数据范围: ,网格中的值满足
示例1

输入

[[2,1,1],[1,0,1],[1,1,1]]

输出

4
示例2

输入

[[2,1,0],[1,0,1],[0,0,0]]

输出

-1
//每一个腐烂苹果,过了一分钟,都会影响上下左右(即下一个层次)苹果的状态,依次类推直到下一层次没有好苹果可以影响到(没有好苹果了,或者影响不到),明显的广度优先搜索
public int rotApple (ArrayList<ArrayList<Integer>> grid) {
        //对应上下左右坐标的改变
        int[] dx = {0, 1, 0, -1};
        int[] dy = {1, 0, -1, 0};
        int m = grid.size(), n = grid.get(0).size();
        Queue<int[]> que = new LinkedList<>();
        int count = 0;
        //遍历,腐烂苹果的坐标放入队列,用于改变上下左右坐标处苹果的状态,count记录好苹果的数量,
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid.get(i).get(j) == 2) {
                    que.add(new int[] {i, j});
                } else if (grid.get(i).get(j) == 1) {
                    count++;
                }
            }
        }
        int round = 0;
        while (count > 0 && !que.isEmpty()) {
            //过去了多少分钟
            round++;
            //队列长度会变,直接把que.size()放入for循环会出错
            int size = que.size();
            for (int i = 0; i < size; i++) {
                int[] org = que.poll();
                //改变当前腐烂苹果的上下左右处苹果的状态
                for (int j = 0; j < 4; j++) {
                    int x = org[0] + dx[j];
                    int y = org[1] + dy[j];
                    //边界判定
                    if (x >= 0 && y >= 0 && x < m && y < n && grid.get(x).get(y) == 1) {
                        grid.get(x).set(y,2);
                        que.add(new int[] {x, y});
                        count--;
                    }
                }
            }
        }
        if (count != 0) {
            return -1;
        } else {
            return round;
        }

发表于 2023-02-15 11:55:02 回复(0)
import java.util.*;


public class Solution {
    private static int[][] dirs = new int[][] {
        {1, 0},
        {-1, 0},
        {0, 1},
        {0, -1}
    };
    
    public int rotApple (ArrayList<ArrayList<Integer>> grid) {  
        int n = grid.size(), m = grid.get(0).size();
        // que: 存放当前时刻已经腐烂的苹果
        Deque<int[]> que = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++){
                if (grid.get(i).get(j) == 2) {
                    que.add(new int[]{i, j});
                }
            }
        }
        int ans = 0;
        while(!que.isEmpty()) {
            ans++;
            int size = que.size();
            for (int i = 0; i < size; i++) {
                int[] cur = que.pollFirst();
                int x = cur[0], y = cur[1];
                for (int[] dir : dirs) {
                    int x0 = x + dir[0];
                    int y0 = y + dir[1];
                    if (x0 >= 0 && x0 < n && y0 >= 0 && y0 < m 
                        && grid.get(x0).get(y0) == 1) {
                        grid.get(x0).set(y0, 2);
                        que.add(new int[]{x0, y0});
                    }
                }
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid.get(i).get(j) == 1) {
                    return -1;
                }
            } 
        }
        // 除去初始时刻
        return ans - 1;
    }
}

/**
2 1 1
1 0 1
1 1 1
**/

发表于 2022-07-18 08:50:59 回复(0)