Общий подход, который я выбрал бы, также был бы равен O (n ^ 2), но, похоже, он больше зависит от количества цифр (полиомино), чем от количества блоков.
Итерируйте по каждому блоку, если он установлен (т. Е. Его значение равно 1), посмотрите на его 4 соединяющиеся соседние ячейки сетки. Исходя из этого (и любых других соединяющих соседних ячеек), вы должны быть в состоянии определить, какая это форма, и вы можете пометить эти ячейки как наблюдаемые, чтобы вы могли пропустить их при переходе к ним. Таким образом, вы будете смотреть на каждую ячейку по очереди, но большая часть кода выполняется только тогда, когда вы активно ищете тромино в ячейке.
Полагаю, очень важно, известно ли число фигур в сетке заранее или нет.