Ctrl K

Карантин для плесени

Сложная
Склад разбит на клетки и задан прямоугольной таблицей grid: 1 — клетка, поражённая плесенью, 0 — чистая. Между любыми двумя соседними по стороне клетками можно поставить одну перегородку. Каждую ночь плесень перебирается из каждой поражённой клетки во все соседние по стороне чистые клетки, если между ними нет перегородки. Ресурсов мало: за день можно оградить только **одно** пятно — связную (по сторонам) группу поражённых клеток. Каждый день выбирается то пятно, которое следующей ночью заразило бы больше всего чистых клеток; ограждение ставится на все границы между ним и чистыми клетками, после чего пятно больше не растёт. Гарантируется, что такое пятно всегда единственное. Процесс продолжается, пока есть пятна, которые могут расти. Верните общее число поставленных перегородок.
Пример 1
grid=[[0, 0, 0], [0, 1, 0], [0, 0, 0]] → 4

Одно пятно в центре граничит с четырьмя чистыми клетками. В первый же день ставим вокруг него 4 стенки — и всё.

Пример 2
grid=[[1, 1, 0, 0, 0], [0, 0, 0, 0, 1]] → 6

Левое пятно угрожает трём клеткам, правое — двум. В первый день изолируем левое (3 стенки), за ночь правое разрастается до [[1, 1, 0, 0, 1], [0, 0, 0, 1, 1]]. На второй день ему нужно ещё 3 стенки: итого 6.

Пример 3
grid=[[1, 1], [1, 1]] → 0

Чистых клеток нет — заражать уже нечего, стенки не нужны.

Ограничения
  • 1 ≤ len(grid), len(grid[0]) ≤ 50
  • grid[i][j] — 0 или 1
  • Каждый день пятно, угрожающее наибольшему числу чистых клеток, единственное
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиЖурнал ходов коня СредняяРамка вокруг кляксы СложнаяСамый длинный подъём по карте СложнаяШарик и лунка СложнаяПереправа в прилив Сложная
загружаем Python…
Вход
grid=[[0, 0, 0], [0, 1, 0], [0, 0, 0]]
Ожидается
4

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 37 тестов на сервере, включая скрытые.