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);