Давайте посмотрим, правильно ли я понял, блоки, помеченные красным цветом, были синего цвета, а алгоритм нашел форму Т и пометил их красным, верно? Ваша цель состоит в том, чтобы найти как можно больше Т-образных фигур с одинаковыми цветными блоками, надеюсь, пока это правильно. В настоящее время вы выделяете их, как только найдете, и это снижает полезность алгоритма (поскольку вы можете упустить оптимальное решение). Вы планируете искать все фигуры, а затем выбирать, какие из них использовать, а какие не использовать. Я правильно до сих пор? Потому что вы хотите максимизировать количество блоков, которые содержатся внутри формы Т, когда алгоритм будет выполнен.
Если я прав, то, на мой взгляд, оптимальным решением для вашей ситуации является следующее.
Мы будем использовать целочисленное линейное программирование.
Я полагаю, что использовал этот в прошлом:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(Вы можете заставить его работать со многими языками, я использовал его с PHP, Java и C)
Что мы сделаем, это зарегистрируем каждую возможную Т-образную форму на доске и затем используем ILP, чтобы максимизировать количество покрываемых блоков. ILP экспоненциально сложен. Учитывая размер вашей доски, это не будет проблемой. Я задал гораздо более сложные вопросы мин / макс на графиках с помощью ILP, и на их заполнение ушли всего лишь доли секунды, а с сотнями вершин - до 30-90 секунд (в вашем случае он падает на доли секунды).
Что я бы порекомендовал сделать:
- Найти все возможные формы линий
- Найти все пересечения между формами линий одного цвета
- Найти все возможные формы Т, ища все пересечения.
- Определите логическую переменную в линейной задаче для каждой формы T (
0 <= Bi <= 1
). Поскольку значения являются целыми числами, это оставляет 0 или 1.
- Сделайте условия для каждой пары Т форм, которые пересекаются (
Bi + Bj <= 1
)
- Целевой функцией будет (сумма блоков в «Т» форме (i) * Bi)
- Запустите решатель и затемните Т-образные формы, где соответствующие логические значения решателя (где 1) в оптимальном решении.
Это ценные знания, я часто использовал линейные решатели для рабочих проектов.
ILP - это в основном способ решения задач выбора, когда вы хотите достичь максимума или минимума для некоторой линейной функции.
Вы можете прочитать больше здесь, используя Integer Linear Programming и Linear Programming - это то же самое для программиста, что Integer намного сложнее для компьютера, что может привести к длительной работе. Не в вашем случае, это очень просто и должно занять менее миллисекунд в худшем случае.
Я думаю, вы могли бы прочитать больше здесь:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
Это хорошо объясняет:
http://fisher.osu.edu/~croxton_4/tutorial/
Это в основном решение проблем, как принимать решения, которые максимизируют желаемый результат. Это предполагает, что функция, которая оценивает результат, является линейной, что в вашем конкретном текущем случае является. Функция, которая оценивает результат в этом случае, суммирует блоки для всех Т-образных форм, которые вы решили затемнить.
Математически, как установить переменные: в нашем текущем случае логические значения (затемнил ли я Т-образную фигуру с индексом i или нет) до оптимальных значений, чтобы максимизировать желаемый результат: затемнение максимально возможного количества блоков без затемнения пересекающихся Т-форм. Если требуемый результат можно рассчитать с помощью линейной функции, когда у вас установлены все переменные, он будет решать ее. В нашем случае мы проверяем, какие Т-формы мы затемнили, и суммируем блоки, которые они покрывают.
Я знаю, что это не тривиально, поэтому, если вы решите совершить прыжок, не стесняйтесь комментировать, и я уточню.