Dada una matriz 2D de valores booleanos, ¿cuál es la forma correcta de determinar si contiene un triángulo?

Hay una solución bastante clara para este problema. Voy a suponer que un triángulo debe estar hecho de 1s y aparecer como lo hizo en su ejemplo; creciendo hacia abajo y hacia la derecha. También supongo que está interesado en encontrar el triángulo más grande, ya que siempre hay un triángulo de tamaño 1.

Puede procesar la matriz fila por fila, haciendo un seguimiento para cada columna del triángulo más grande que se puede hacer en esta fila con esa columna como la esquina inferior izquierda. Puede inicializar esta matriz a todos los 0.

A medida que procesa cada fila, puede actualizar cada columna contando cuántos 1s hay comenzando desde esa columna hacia la derecha. Si hay X 1s y el triángulo más grande que se pudo hacer de la fila anterior en esta columna era el tamaño Y, entonces el triángulo más grande que se puede hacer en esta fila y columna es min (X, Y + 1). Puede actualizar todas las posiciones de la matriz con un paso lineal de la matriz de derecha a izquierda, rastreando cuántos 1s ha habido sin un 0.

El triángulo más grande que puedes hacer es el triángulo más grande que hayas encontrado.

Pensamiento aleatorio que parece correcto (pero ¿quién sabe?):

Si estamos definiendo el triángulo de la manera que supongo (estrictamente), entonces la línea superior con un 1 debe representar un lado o un vértice. De cualquier manera, tendrá dos “líneas” que salen de la línea superior para representar un triángulo. Puede encontrar la pendiente de esas dos líneas examinando la siguiente línea de 0 y 1. Para que sea un triángulo, esas líneas deben continuar con la misma pendiente hasta que se detengan. Los puntos finales de esas dos líneas deben conectarse de manera similar con una línea de una pendiente dada. No debe haber 1 fuera del triángulo definido por esas tres líneas. Si los puntos dentro del triángulo deben ser 1 o 0, no lo sé.

Esto supone que no estamos tratando con algún tipo de triángulo de “ajuste más cercano”, lo que significaría que la pendiente de la línea cambiaría de una fila a la siguiente.