В вашем вопросе есть некоторая неопределенность. Например, делает:
1 1 1
1 1 1
1 1 1
содержит 6 строк, T, U и кучу других букв алфавита? Или все буквы разделены? Ваш первоначальный вопрос подразумевал, что буквы могут быть обнаружены перекрывающимся способом, потому что шаблон T содержит две строки. Таким образом, матрица, в которой все элементы были включены, будет содержать каждую возможную букву / строку в каждой возможной позиции.
Кроме того, я предполагаю, что вас беспокоит только поворот на 90 градусов, и вы не захотите пытаться найти смещенные на 45 градусов буквы, когда размеры матриц становятся достаточно большими, чтобы их поддерживать.
С точки зрения простоты реализации, подход грубой силы, о котором вы говорите (проверка каждой позиции на все четыре вращения букв), действительно выигрывает, я бы сказал.
В качестве альтернативы, вы можете получить довольно причудливое выражение (предупреждение: впереди смутные описания алгоритмов!):
1) Прогуливаясь по элементам матрицы, пока не найдете 1. Затем, по существу, заполните заливку из этой 1 в стеке и следите за изменениями направления. Затем используйте какой-нибудь инвариантный при вращении поиск, который отображал набор включенных пикселей на найденные буквы.
2) Используйте какое-либо описание целочисленного изображения или коробочного фильтра, чтобы взять суммы подразделов матрицы. Затем можно выполнить поиск по подразделам и сопоставить суммы подразделов со значениями букв / строк.
3) Поскольку комментарии определили, что вы действительно ищете только 4 фигуры, новый подход может оказаться полезным. Вы только исследуете 4 фигуры (линия, крест, T и U), если я не ошибаюсь. Каждый из них может быть в 4-х направлениях. Один быстрый совет: вы можете просто запустить алгоритм 4 раза, но повернуть основную матрицу на 90 градусов. Тогда вам не нужно настраивать вращение в вашем алгоритме. Также обратите внимание, что крест нужно найти только в одной ориентации, потому что он выглядит одинаково во всех четырех ориентациях, а линия идентична в двух ориентациях. В любом случае, вы могли бы сэкономить некоторую работу, отыскивая «самые сложные» вещи, которые должны соответствовать первым. Допустим, я ищу вертикальное «U» здесь:
1 0 1
1 0 1
1 1 1
Я начинаю сверху слева. Вместо того, чтобы проверять, чтобы убедиться, что все пиксели «выключены» (или 0), я перехожу к следующему месту, где я ожидаю найти значение «вкл» (или 1). Допустим, это пиксель внизу слева вверху. Я проверяю средний левый пиксель, и он действительно включен. Затем я проверяю ниже этого. Если вы разрабатываете простой набор правил для каждой буквы, вы можете быстро отказаться от его поиска, если у вас не включены требуемые значения. Если вы затем запустите один и тот же алгоритм 4 раза и будете искать только вертикальные значения, я не уверен, что вы сможете добиться гораздо большего, чем этот!
Подходы, которые я упомянул, - просто идеи. Тем не менее, они могут доставить больше хлопот, чем стоят, с точки зрения повышения эффективности. И кто знает, они могут вообще не работать!
Удачи!