Cómo encontrar la submatriz cuadrada máxima con todas en una matriz booleana de tamaño mxn

Algoritmo:
Deje que la matriz binaria dada sea M [R] [C]. La idea del algoritmo es construir una matriz de tamaño auxiliar S [] [] en la que cada entrada S [i] [j] represente el tamaño de la submatriz cuadrada con todos los 1 incluyendo M [i] [j] donde M [ i] [j] es la entrada más a la derecha e inferior en la submatriz.

1) Construya una matriz de suma S [R] [C] para la M [R] [C] dada.

a) Copie la primera fila y las primeras columnas como está de M [] [] a S [] []

b) Para otras entradas, use las siguientes expresiones para construir S [] []

Si M [i] [j] es 1, entonces

S [i] [j] = min (S [i] [j-1], S [i-1] [j], S [i-1] [j-1]) + 1

De lo contrario / * Si M [i] [j] es 0 * /

S [i] [j] = 0

2) Encuentra la entrada máxima en S [R] [C]

3) Utilizando el valor y las coordenadas de entrada máxima en S [i], imprima la submatriz de M [] []

Para la M [R] [C] dada en el ejemplo anterior, la S [R] [C] construida sería:

0 1 1 0 1

1 1 0 1 0

0 1 1 1 0

1 1 2 2 0

1 2 2 3 1

0 0 0 0 0

El valor de la entrada máxima en la matriz anterior es 3 y las coordenadas de la entrada son (4, 3). Usando el valor máximo y sus coordenadas, podemos encontrar la submatriz requerida.

#include

#define bool int

#define R 6

#define C 5

vacío printMaxSubSquare (bool M [R] [C])

{

int i, j;

int S [R] [C];

int max_of_s, max_i, max_j;

/ * Establecer primera columna de S [] [] * /

para (i = 0; i <R; i ++)

S [i] [0] = M [i] [0];

/ * Establecer primera fila de S [] [] * /

para (j = 0; j <C; j ++)

S [0] [j] = M [0] [j];

/ * Construir otras entradas de S [] [] * /

para (i = 1; i <R; i ++)

{

para (j = 1; j <C; j ++)

{

si (M [i] [j] == 1)

S [i] [j] = min (S [i] [j-1], S [i-1] [j], S [i-1] [j-1]) + 1;

más

S [i] [j] = 0;

}

}

/ * Encuentra la entrada máxima e índices de entrada máxima

En s[][] */

max_of_s = S [0] [0]; max_i = 0; max_j = 0;

para (i = 0; i <R; i ++)

{

para (j = 0; j <C; j ++)

{

if (max_of_s <S [i] [j])

{

max_of_s = S [i] [j];

max_i = i;

max_j = j;

}

}

}

printf (“\ n La matriz secundaria de tamaño máximo es: \ n”);

para (i = max_i; i> max_i – max_of_s; i–)

{

para (j = max_j; j> max_j – max_of_s; j–)

{

printf (“% d”, M [i] [j]);

}

printf (“\ n”);

}

}

/* FUNCIONES DE UTILIDAD */

/ * Función para obtener un mínimo de tres valores * /

int min (int a, int b, int c)

{

int m = a;

si (m> b)

m = b;

si (m> c)

m = c;

volver m;

}

/ * Función del controlador para probar las funciones anteriores * /

int main ()

{

bool M [R] [C] = {{0, 1, 1, 0, 1},

{1, 1, 0, 1, 0},

{0, 1, 1, 1, 0},

{1, 1, 1, 1, 0},

{1, 1, 1, 1, 1},

{0, 0, 0, 0, 0}};

printMaxSubSquare (M);

getchar ();

}

Gracias por A2A

Aquí está el algoritmo:

Paso 1: cree una tabla vacía de tamaño mxn, definida como
tabla [i] [j] = Tamaño de submatriz cuadrada máxima con todos los 1s con matriz [i] [j] como elemento inferior derecho.

Paso 2: establecer valores en la tabla en función de las condiciones
a. si i = 0 o j = 0, tabla [i] [j] = matriz [i] [j]
si. de lo contrario, si la matriz [i] [j] = 0, entonces la tabla [i] [j] = 0
do. sino tabla [i] [j] = min (tabla [i – 1] [j – 1], tabla [i – 1] [j], tabla [i] [j – 1]) + 1;

Durante el paso 2, mantenga el elemento más grande agregado en la tabla y finalmente devuélvalo.

Fuente: submatriz cuadrada de tamaño máximo con todos los 1

Consulte el video para obtener una explicación detallada del algoritmo con animaciones.

Espero que esto ayude.

More Interesting

¿Cómo entrenan algunas aplicaciones los algoritmos de aprendizaje automático en tiempo real en su teléfono?

Cómo resolver este problema en la búsqueda binaria

¿Es posible implementar un montón dinámico paralelo?

¿Cuál es un buen editorial para Cube Cakes en CodeChef?

Matemáticas generales que uno debe saber antes de tomar la clase de algoritmo? Especialmente para estudiantes con antecedentes no informáticos.

Si recientemente completé un campo de entrenamiento y todo lo que queda para conseguir un trabajo es la prueba técnica, ¿cuántas horas serán suficientes los algoritmos de aprendizaje?

¿Cuáles son las fuentes que pueden proporcionar múltiples metodologías a partir de un nivel básico para resolver problemas algorítmicos?

Cómo implementar prácticamente algoritmos enseñados por Andrew Ng en su curso de aprendizaje automático

Cómo resolver la recursividad cuando no tienen caminos claros

¿Cómo saben las computadoras cuándo comienza y termina una cadena binaria?

¿Conoces alguna biblioteca de diario E2PROM que pueda usarse en controladores de 8 bits o al menos un algoritmo para hacerlo?

Cómo escribir un algoritmo para la suma de n factoriales. es decir, 1! +2! +3! +… (N-1) + n

¿Se necesitarán estructuras de datos y algoritmos para los ingenieros de diseño analógico o EDA?

¿Cuál es la forma más eficiente de representar una matriz binaria dispersa?

¿Cuál es el método más fácil para eliminar el último elemento de una matriz numpy 2D?