Imagine que tiene una submatriz cuadrada donde cada celda es negra o blanca. ¿Cómo se puede diseñar un algoritmo para encontrar el subcuadrado máximo de modo que los cuatro bordes estén llenos de píxeles negros?

// Un programa en C ++ para encontrar el subcuadro más grande
// rodeado de ‘X’ en una matriz dada de ‘O’ y ‘X’
#include
usando el espacio de nombres estándar;

// El tamaño de la matriz dada es NXN
#define N 6

// Una función de utilidad para encontrar un mínimo de dos números
int getMin (int x, int y) {return (x <y)? x: y; }

// Devuelve el tamaño de la matriz subcuadrada de tamaño máximo
// rodeado de ‘X’
int findSubSquare (int mat [] [N])
{
int max = 1; // Inicializar resultado

// Inicializa el valor superior izquierdo en hor [] [] y ver [] []
int hor [N] [N], ver [N] [N];
hor [0] [0] = ver [0] [0] = (mat [0] [0] == ‘X’);

// Rellenar valores en hor [] [] y ver [] []
para (int i = 0; i <N; i ++)
{
para (int j = 0; j <N; j ++)
{
if (mat [i] [j] == ‘O’)
ver [i] [j] = hor [i] [j] = 0;
más
{
hor [i] [j] = (j == 0)? 1: hor [i] [j-1] + 1;
ver [i] [j] = (i == 0)? 1: ver [i-1] [j] + 1;
}
}
}

// Comience desde el elemento de esquina más a la derecha y encuentre
// el ssubsquare más grande con la ayuda de hor [] [] y ver [] []
para (int i = N-1; i> = 1; i–)
{
para (int j = N-1; j> = 1; j–)
{
// Encuentra valores más pequeños en hor [] [] y ver [] []
// Un cuadrado solo se puede hacer tomando más pequeño
// valor
int pequeño = getMin (hor [i] [j], ver [i] [j]);

// En este punto, estamos seguros de que existe un derecho
// línea vertical y línea horizontal inferior de longitud
// al menos ‘pequeño’.

// Encontramos un cuadrado más grande si las siguientes condiciones
// se cumplan:
// 1) Si el lado del cuadrado es mayor que max.
// 2) Hay una línea vertical izquierda de longitud> = ‘pequeño’
// 3) Hay una línea horizontal superior de longitud> = ‘pequeño’
while (pequeño> max)
{
if (ver [i] [j-small + 1]> = pequeño &&
hor [i-small + 1] [j]> = pequeño)
{
max = pequeño;
}
pequeña-;
}
}
}
retorno max;
}

// Programa de controlador para probar la función anterior
int main ()
{
int mat [] [N] = {{‘X’, ‘O’, ‘X’, ‘X’, ‘X’, ‘X’},
{‘X’, ‘O’, ‘X’, ‘X’, ‘O’, ‘X’},
{‘X’, ‘X’, ‘X’, ‘O’, ‘O’, ‘X’},
{‘O’, ‘X’, ‘O’, ‘X’, ‘X’, ‘X’},
{‘X’, ‘X’, ‘X’, ‘O’, ‘X’, ‘O’},
{‘X’, ‘O’, ‘X’, ‘O’, ‘X’, ‘X’},
};
cout << findSubSquare (mat);
devuelve 0;
}

http://www.geeksforgeeks.org/giv…