Давайте представим, что у нас есть матрица битов (которая содержит хотя бы один 1
):
0 1 0 1 1 0 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 0 1 0 1 1 0 1 0 1 0
1 1 0 0 1 0 0 1 1 0 1
0 0 0 1 0 1 1 0 0 1 0
Мы хотим установить некоторые из битов в этой матрице так, чтобы она образовывала непрерывный двоичный объект 1
s, в котором каждый 1
прямо или косвенно связан друг с другом 1
посредством ортогонального движения:
0 1 1 1 1 1 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 1 1 0 1 1 1 1 0 1 0
1 1 0 0 1 0 0 1 1 1 1
0 0 0 1 1 1 1 0 0 1 0
(Вы можете увидеть это более четко, выполнив поиск 1
с помощью функции поиска в браузере.)
Однако мы также хотим минимизировать количество битов, которые мы устанавливаем.
Задание
Учитывая матрицу (или массив массивов) битов или логических значений, вернуть минимальное число битов, которое необходимо установить для создания непрерывного континента 1
s. Должна существовать возможность перехода от одного установленного бита в матрице к другому только путем перемещения в ортогональном направлении к другим установленным битам.
Это код-гольф , поэтому выигрывает самое короткое действительное представление (измеряется в байтах).
Тестовые случаи
0 1 0 1 1 0 1 0 0 1 0
0 1 0 1 0 0 1 0 1 1 0
0 0 1 0 1 1 0 1 0 1 0
1 1 0 0 1 0 0 1 1 0 1
0 0 0 1 0 1 1 0 0 1 0
=> 6
1 0 0 0 0 0 1 0 0
1 1 0 0 1 1 1 0 0
1 1 1 0 1 1 1 1 1
0 1 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 1
0 1 0 0 0 0 1 1 0
1 0 0 0 0 0 1 0 0
=> 4
0 0 0 1 1 1 0 1 1
0 0 1 0 0 0 0 1 0
0 0 1 1 1 1 1 1 0
1 1 0 0 1 1 0 0 0
0 0 1 1 1 0 0 1 1
0 1 1 1 0 0 0 0 0
1 1 1 0 0 1 1 1 0
1 1 1 0 1 1 0 1 1
0 0 0 0 1 0 0 0 1
1 1 0 0 1 1 0 1 1
0 0 0 0 0 0 0 1 0
0 1 1 1 1 0 0 0 0
0 0 0 1 1 0 0 0 1
0 1 0 0 1 0 1 1 0
0 1 1 1 0 0 0 0 1
=> 8
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
=> 0
источник
1
в матрице нет?Ответы:
C (gcc),
308306 байтФункция
f
получает(height, width, flattened array, pointer to ans)
и возвращает ответ по указателю.Если нет
1
в матрице, он вернется0
.Попробуйте онлайн!
Ungolfed:
источник
Python 2 , 611 байт
Полная программа, которая принимает список списков через пользовательский ввод. Функции
I
иd
подсчитать количество островов в массиве. Цикл for в конце перечисляет все возможности, где вы можете изменить0
s на1
s, тогда, если остался один островок, хранится число1
s, добавленных в списокC
. Минимум этого списка - это минимальное количество битовых переключений, необходимых для соединения любых островков. Это очень медленный алгоритм, поэтому он не запускает тестовые наборы, представленные менее чем за 60 секунд (я не пробовал больше), но я пробовал несколько меньших (~ 5x5) тестовых примеров, и похоже, что он работает правильно. Я получил алгоритм подсчета островов с этой страницы.Попробуйте онлайн!
Предварительная версия, прежде чем я оптимизировал несколько вещей:
источник