package com.fishercoder.solutions;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 994. Rotting Oranges
 *
 * In a given grid, each cell can have one of three values:
 *
 * the value 0 representing an empty cell;
 * the value 1 representing a fresh orange;
 * the value 2 representing a rotten orange.
 * Every minute, any fresh orange that is adjacent (4-directionally) to a
 * rotten orange becomes rotten.
 * Return the minimum number of minutes that must elapse until no cell has a fresh orange.
 * If this is impossible, return -1 instead.
 *
 * Example 1:
 * Input: [[2,1,1],[1,1,0],[0,1,1]]
 * Output: 4
 *
 * Example 2:
 * Input: [[2,1,1],[0,1,1],[1,0,1]]
 * Output: -1
 * Explanation:  The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.
 *
 * Example 3:
 * Input: [[0,2]]
 * Output: 0
 * Explanation:  Since there are already no fresh oranges at minute 0, the answer is just 0.
 *
 * Note:
 * 1 <= grid.length <= 10
 * 1 <= grid[0].length <= 10
 * grid[i][j] is only 0, 1, or 2.
 */
public class _994 {
    public static class Solution1 {
        int[] directions = new int[]{0, 1, 0, -1, 0};

        public int orangesRotting(int[][] grid) {
            Queue<int[]> rottens = new LinkedList<>();
            for (int i = 0; i < grid.length; i++) {
                for (int j = 0; j < grid[0].length; j++) {
                    if (grid[i][j] == 2) {
                        rottens.add(new int[]{i, j});
                    }
                }
            }
            int times = 0;
            while (!rottens.isEmpty()) {
                int size = rottens.size();
                boolean counted = false;
                for (int k = 0; k < size; k++) {
                    int[] rotten = rottens.poll();
                    for (int i = 0; i < 4; i++) {
                        int x = rotten[0] + directions[i];
                        int y = rotten[1] + directions[i + 1];
                        if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length && grid[x][y] == 1) {
                            grid[x][y] = 2;
                            if (!counted) {
                                times++;
                            }
                            counted = true;
                            rottens.add(new int[]{x, y});
                        }
                    }
                }
            }
            for (int i = 0; i < grid.length; i++) {
                for (int j = 0; j < grid[0].length; j++) {
                    if (grid[i][j] == 1) {
                        return -1;
                    }
                }
            }
            return times;
        }
    }
}

@@ -87,991 +87,8 @@
 e;%0A%0A
-/**%0A * 994. Rotting Oranges%0A *%0A * In a given grid, each cell can have one of three values:%0A *%0A * the value 0 representing an empty cell;%0A * the value 1 representing a fresh orange;%0A * the value 2 representing a rotten orange.%0A * Every minute, any fresh orange that is adjacent (4-directionally) to a%0A * rotten orange becomes rotten.%0A * Return the minimum number of minutes that must elapse until no cell has a fresh orange.%0A * If this is impossible, return -1 instead.%0A *%0A * Example 1:%0A * Input: %5B%5B2,1,1%5D,%5B1,1,0%5D,%5B0,1,1%5D%5D%0A * Output: 4%0A *%0A * Example 2:%0A * Input: %5B%5B2,1,1%5D,%5B0,1,1%5D,%5B1,0,1%5D%5D%0A * Output: -1%0A * Explanation:  The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.%0A *%0A * Example 3:%0A * Input: %5B%5B0,2%5D%5D%0A * Output: 0%0A * Explanation:  Since there are already no fresh oranges at minute 0, the answer is just 0.%0A *%0A * Note:%0A * 1 %3C= grid.length %3C= 10%0A * 1 %3C= grid%5B0%5D.length %3C= 10%0A * grid%5Bi%5D%5Bj%5D is only 0, 1, or 2.%0A */%0A
 publ

refactor 994