Прямоугольные крышки
Предположим, у вас есть матрица битов, например, следующая.
1 1 0 0 0 1 1 0
1 1 1 1 0 1 1 1
0 1 1 1 0 1 1 1
1 1 0 1 1 1 1 0
1 1 0 1 1 1 0 1
Мы хотели бы найти прямоугольное покрытие для этой матрицы. Это набор прямоугольных подмножеств матрицы, которые не содержат 0, но вместе содержат все 1. Подмножества не обязательно должны быть непересекающимися. Вот пример прямоугольного покрытия для вышеуказанной матрицы.
+----+ +----+
|1 1| 0 0 0 |1 1| 0
| | | |
| +-|-----+ | |+-+
|1 |1| 1 1| 0 |1 1||1|
+----+ | | || |
| | | || |
0 |1 1 1| 0 |1 1||1|
+-------+ | |+-+
+----+ +-----|-+ |
|1 1| 0 |1 1 |1| 1| 0
| | | +----+
| | | | +-+
|1 1| 0 |1 1 1| 0 |1|
+----+ +-------+ +-+
Количество прямоугольников в этой обложке 7.
Задание
Ваш ввод представляет собой прямоугольную матрицу битов, взятых в любом приемлемом формате. Вы можете предположить, что он содержит хотя бы один 1. Ваш вывод - это минимальное количество прямоугольников в прямоугольной обложке матрицы.
Побеждает самое низкое число байтов. Применяются стандартные правила игры в гольф .
Контрольные примеры
[[1]] -> 1
[[1,1]] -> 1
[[1],[1]] -> 1
[[1,0,1]] -> 2
[[1,0],[0,0]] -> 1
[[1,0],[0,1]] -> 2
[[1,0],[1,1]] -> 2
[[1,1,1],[1,0,1]] -> 3
[[0,1,0],[1,1,1],[0,1,0]] -> 2
[[1,1,1],[1,0,1],[1,1,1]] -> 4
[[1,1,0],[1,1,1],[0,1,1]] -> 2
[[1,0,1,0],[1,1,1,1],[1,0,1,0]] -> 3
[[1,1,1,0],[1,0,1,0],[1,1,1,1],[0,0,1,0]] -> 4
[[1,1,1,0],[1,0,1,0],[1,1,1,1],[0,0,1,1]] -> 5
[[1,1,1,0],[1,0,1,0],[1,1,1,1],[0,1,1,1]] -> 4
[[1,1,0,0],[1,1,1,0],[0,1,1,1],[0,0,1,1]] -> 3
[[0,1,0,0],[0,1,1,1],[1,1,1,0],[0,0,1,0]] -> 4
[[0,0,1,0,0],[0,1,1,1,0],[1,1,1,1,1],[0,1,1,1,0],[0,0,1,0,0]] -> 3
code-golf
matrix
optimization
Zgarb
источник
источник
[[0,1,0,0],[0,1,1,1],[1,1,1,0],[0,0,1,0]]
4.Ответы:
Python 2 ,
318,315,271 байт.Mr.Xcoder, ovs и Jonathan Frech сэкономили много байтов
Попробуйте онлайн!
источник
Желе ,
2524 байтаПопробуйте онлайн! Типичное решение для сложности игры в гольф, даже не пытайтесь работать с более крупными контрольными случаями, они истекают (проверяется набор мощности всех возможных прямоугольников *)
Как?
Формирует все возможные прямоугольники, которые могут быть сделаны. Принимает набор этих прямоугольников и проверяет их, сохраняя только те наборы, которые не содержат нулей и содержат каждый из них хотя бы один раз.
Чтобы добиться «сохранения тех наборов, которые оба не содержат нулей и содержат каждый из них хотя бы один раз», код сначала приводит единицы к набору различных целых чисел, больших единицы, оставляя нули такими, какие они есть, чтобы они становились » нахождение максимумов произведения уникальных значений ».
* Для матрицы n на m это способы (n, m) = 2 ^ (T (n) × T (m)) , поэтому ...
way (3,2) = 2 ^ ((3 + 2 + 1) × (2 + 1)) = 2 ^ 18 = 262 144 (ссылка TIO)
пути (3,3) = 2 ^ ((3 + 2 + 1) × (3 + 2 + 1)) = 2 ^ 36 = 68 719 476 736
пути (3,4) = 2 ^ ((3 + 2 + 1) × (4 + 3 + 2 + 1)) = 2 ^ 60 = 1 152 921 504 606 846 976
путей (5,5) = 2 ^ 225 ~ = 5,4e + 67 (самый большой контрольный пример)
способами (8,5) = 2 ^ 540 ~ = 3,6e + 162 (пример)
источник
FJṁ×⁸ẆZ€Ẇ€ẎŒPFQS$$ÐṀL€Ṃ
работать на -1? Нет времени проверять рН.1
будет иметь тот же продукт, что и действительная обложка (например, повернуть пример восемь на пять на пол-оборота, и она (в теории) вернется,6
как если бы она пренебрегала крышкой сверху и считайте его действительным.)[[1,0],[0,1]]
вернется,1
а не2
.JavaScript, 434 байта
Код:
Hexdump (из-за непечатаемых символов):
Попробуйте онлайн!
Это не очень хорошо, но, по крайней мере, работает очень быстро. Все тестовые случаи могут быть вычислены за несколько миллисекунд.
Ungolfed
объяснение
Он использует аналогичный алгоритм, как для решения карт Карно. Сначала он пытается найти хотя бы один,
1
который может быть частью ровно одного нерасширяемого прямоугольника. Под нерасширяемым я подразумеваю, что если мы расширим его в каком-либо направлении (вверх, влево, вправо, вниз), он будет включать хотя бы один0
(или выйдет за пределы матрицы). Когда такое1
найдено, найдите самый большой прямоугольник, который включает его, и пометьте все1
s в этом прямоугольнике. Повторяйте до тех пор, пока не будет больше не отмеченных1
s, которые удовлетворяют этим условиям.В некоторых случаях (например, в 16-м тестовом примере) есть
1
s, которые остались после применения первого шага. Затем перечислите все эти значения1
и примените некоторый расширенный поиск методом грубой силы. Этот шаг применяется редко, и даже в этих случаях нам нужно проверять методом грубой силы только одну или две комбинации, поэтому он должен работать очень быстро даже для больших тестовых случаев.источник