Скажем, у меня есть сетка блоков, 7x12. Мы используем цвета '*', '%', '@' и пустую ячейку '-'.
1 2 3 4 5 6 7
- - - - - - - 1
- - - - - - - 2
% % - - - - - 3
% % - - - - * 4
% % - - - @ % 5
@ @ @ - - @ % 6
@ @ * * * - * 7
* * * % % % % 8
% @ @ % * * % 9
% @ % % % % % 10
* * * % % @ @ 11
* * @ @ @ @ * 12
Я хочу найти прямоугольники в этой сетке с определенным минимальным размером, и самый большой, который я могу найти, а затем меньше, пока не будут найдены прямоугольники, большие или равные минимальному размеру.
В этом примере рассмотрим минимальный размер 1x4, 4x1, 2x2, поэтому 1x3 недействителен, но 2x3. Если нам нужны самые большие прямоугольники, мы находим следующее:
- 4x1 at (4,8)
- 5x1 at (3,10)
- 2x3 at (1,3)
- 2x2 at (6,1)
- 2x2 at (1,11)
- 4x1 at (3,12)
Обратите внимание, что прямоугольники не могут находиться в пространстве друг друга, они не могут перекрываться. Например, прямоугольник 2x2 в (4,10) не упоминается, потому что он будет перекрывать прямоугольник 5x1 в (3,10).
Все являются вполне допустимыми прямоугольниками: они равны или больше, что минимальный размер и все блоки на каждый прямоугольник имеют один и тот же цвет.
Я хочу сделать это программно. Когда вы говорите кому-то, чтобы найти прямоугольники в сетке, он находит их незамедлительно, не задумываясь об этом. Вопрос в том, как я могу написать алгоритм, который делает то же самое?
Я считал bruteforcing, но мне нужно, чтобы алгоритм выполнялся как можно быстрее, так как он должен выполняться много в очень малом временном интервале на ограниченном (мобильном) устройстве.
Я вижу много вопросов в Интернете о прямоугольниках, но я удивлен, что этого еще нигде не задавали. Думаю ли я слишком сложно или никогда не хотел делать что-то подобное?