PS: Не прокручивайте страницу, если вы ищете что-либо, связанное с новостями о covid19, это сообщение не попадает в какие-либо данные или новости, связанные со вспышкой!

Это я, нормализуя кодирование как проблему, чтобы определить, насколько важно социальное дистанцирование, даже если распространение всего четырехстороннее.

Вот проблема -

В гипотетическом мире, где все люди могут стоять в сетке m * n и в любой день, человеческая сетка может иметь следующие значения в ячейке:

Значение 0: ячейка пуста

Значение 1: человек не заражен

Значение -1: человек заражен

Каждый день незараженный человек может заразить своего соседа в четырех направлениях (вверх / вниз / влево / вправо).

Нам нужно найти количество дней, которые пройдут, чтобы все люди в человеческой сети были инфицированы. Если это невозможно, мы должны вернуть -1.

Например, следующая человеческая сетка -

На то, чтобы затронуть всех, потребуется 18 дней!

Вот решение, которое принимает человеческую сетку в качестве входных данных и возвращает количество дней:

/****
 * Assuming the humans can stand in a grid of some mXn
 * @param humans
 * @return
 */
public int infectedHumans(int[][] humans) {
    if(null == humans || humans.length == 0){
        return 0;
    }

    int rows = humans.length;
    int cols = humans[0].length;

    /***
     * We will use infectedHumans queue to do the BFS
     */
    Queue<int[]> infectedHumans = new LinkedList<>();
    int nonInfectedHumans = 0;
    // put the current state
    for(int i = 0 ; i < rows; i++){
        for(int j = 0 ; j < cols ; j++){
            if(humans[i][j] == -1){
                infectedHumans.offer(new int[] {i, j});
            }else if (humans[i][j] == 1){
                nonInfectedHumans ++;
            }
        }
    }

    int days = 0;

    /***
     * If every one is infected, then we can return 0 the current moment
     */
    if(nonInfectedHumans == 0) return days;

    /**
     * Assuming virus can be passed in 4 directions in the cells up/down/lef/right
     */
    int[][] directions = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
    /**
     * Let's traverse in the four directions
     */
    while(!infectedHumans.isEmpty()){
        ++days;
        int size = infectedHumans.size();
        for(int i = 0 ; i < size ; i ++){
            int [] currentPos = infectedHumans.poll();
            for (int [] move : directions){
                int nextMoveX = currentPos[0] + move[0];
                int nextMoveY = currentPos[1] + move[1];

                // if it's a valid move, not a infected human move || not an empty move
                if(nextMoveX < 0 || nextMoveY < 0 || nextMoveX >= rows || nextMoveY >= cols || humans[nextMoveX][nextMoveY] == 0 || humans[nextMoveX][nextMoveY] == -1) continue;
                humans[nextMoveX][nextMoveY] = -1;
                infectedHumans.offer(new int[] {nextMoveX, nextMoveY});
                nonInfectedHumans--;
            }
        }
    }
    return nonInfectedHumans == 0 ? (days - 1) : -1;
}

Вот и все!

Оставайтесь в безопасности, оставайтесь на связи, поддерживайте социальное дистанцирование - мы все вместе! будем сильнее, чем когда-либо, помогаем сообществу, и вместе мы сможем добиться успеха!