Предположим, что у меня есть следующая матрица:
Матрица может быть разбита на куски, так что каждый кусок должен для всех строк иметь одинаковое количество столбцов, где значение помечено как true для этой строки.
Например, следующий фрагмент действителен:
Это означает, что строки не должны быть смежными.
Столбцы также не должны быть смежными, так как следующий допустимый фрагмент:
Однако недопустимо следующее:
Тем не менее, что такое алгоритм, который можно использовать для выбора кусков, так что минимальное количество кусков будет использоваться при поиске всех кусков?
В приведенном выше примере правильное решение (элементы с тем же цветом представляют действительный фрагмент):
В приведенном выше примере три - это минимальное количество кусков, которые можно разбить на.
Обратите внимание, что также является допустимым решением:
Там нет предпочтения к решениям, действительно, чтобы получить наименьшее количество кусков.
Я думал о подсчете использования смежных ячеек, но это не учитывает тот факт, что значения столбца не должны быть смежными.
Я считаю, что ключ заключается в поиске кусков с наибольшей площадью с учетом ограничений, удаления этих элементов, а затем повторения.
Принимая этот подход, решение:
Но как перемещаться по матрице и находить наибольшую площадь, это ускользает от меня.
Также обратите внимание, что если вы хотите перетасовать строки и/или столбцы во время операций, это действительная операция (чтобы найти самую большую область), но я бы предположил, что вы можете сделать это только после удаления (после того, как одна область найдена и перемещается на следующую).