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