Answer

Answer

t.me/js_test

Ответ:

const seatTheGuests = (hall, height, width) => {
    const getNeighbors = (y, x, width, height) => {
        const neighbors = [];

        if (y - 1 >= 0) {
            neighbors.push([y - 1, x]);
        }
        if (y + 1 < height) {
            neighbors.push([y + 1, x]);
        }
        if (x - 1 >= 0) {
            neighbors.push([y, x - 1]);
        }
        if (x + 1 < width) {
            neighbors.push([y, x + 1]);
        }

        return neighbors;
    };

    const queue = [];
    let count = 1;
    queue.push([0, 0]);

    while (queue.length > 0) {
        const neighbors = getNeighbors(...queue.shift(), width, height);

        for (const neighbor of neighbors) {
            if (hall[neighbor[0]][neighbor[1]] === 0) {
                queue.push([neighbor[0], neighbor[1]]);
                count++;
                hall[neighbor[0]][neighbor[1]] = count;
            }
        }
    }
};

Объяснение:

Для решения будем использовать обход в ширину. Создаём очередь queue, счётчик count который обозначает важность гостя и кладём в очередь гостя который уже сидит в зале. Далее в цикле пока длина очереди больше нуля находим соседей первого значения в очереди (для этого мы создали вспомогательную функцию getNeighbors которая возвращает нам соседей по 4 сторонам). Проходимся по всем соседям циклом for и если на месте соседа в зале ещё никто не сидит, то есть по координатам соседа лежит значение 0, то добавляем соседа в очередь, прибавляем count и садим гостя на это место.

Код для проверки:

const seatTheGuests = (hall, height, width) => {
    const getNeighbors = (y, x, width, height) => {
        const neighbors = [];

        if (y - 1 >= 0) {
            neighbors.push([y - 1, x]);
        }
        if (y + 1 < height) {
            neighbors.push([y + 1, x]);
        }
        if (x - 1 >= 0) {
            neighbors.push([y, x - 1]);
        }
        if (x + 1 < width) {
            neighbors.push([y, x + 1]);
        }

        return neighbors;
    };

    const queue = [];
    let count = 1;
    queue.push([0, 0]);

    while (queue.length > 0) {
        const neighbors = getNeighbors(...queue.shift(), width, height);

        for (const neighbor of neighbors) {
            if (hall[neighbor[0]][neighbor[1]] === 0) {
                queue.push([neighbor[0], neighbor[1]]);
                count++;
                hall[neighbor[0]][neighbor[1]] = count;
            }
        }
    }
};

const HEIGHT = 5, WIDTH = 4;
const hall = [];
for (let i = 0; i < HEIGHT; i++) {
    const row = [];
    for (let j = 0; j < WIDTH; j++) {
        row.push(0);
    }
    hall.push(row);
}
hall[0][0] = 1;

seatTheGuests(hall, HEIGHT, WIDTH);

console.log(hall);

Report Page