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 [] []
- ¿Qué debo aprender a usar el algoritmo AlphaGo Zero para otras aplicaciones con conjuntos de datos y reglas?
- ¿Cómo podría un algoritmo que crea un cambio en el comportamiento del consumidor crear valor?
- Cómo escribir una matriz de distancia para el algoritmo Bellman Ford
- ¿Qué puedes hacer con los algoritmos?
- Programadores: ¿A menudo considera el promedio, el peor y el mejor caso en mente al escribir un algoritmo?
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 ();
}