Puoi rappresentare l'immagine con un array in cui i punti non bianchi hanno valori negativi e i punti bianchi hanno valori positivi.
A questo punto possiamo utilizzare l'algoritmo di Kadane per la ricerca di un sottoarray di somma massima.
Nell'esempio che segue abbiamo un array di dieci righe e dieci colonne.
I punti bianchi sono rappresentati col valore 1; i punti non bianchi col valore -1.
Il programma restituisce il sottoarray(può essere rettangolare o quadrato) con la maggiore concentrazione di punti bianchi.
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
#include <limits.h>
/*
gcc -Wall -Wextra -pedantic -O2 KadaneSubCubic3.c -o prova3
*/
int main()
{
int i, j, k, l, m, n, z, x, x1, x2, y1, y2, s, t, S;
int index;
int column[11][11];
int a[11][11];
int my_array[100] =
{
-1, -1, -1, 1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 1, 1, 1, -1, -1, -1, -1, -1, -1,
-1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
-1, 1, 1, 1, 1, 1, 1, -1, -1, -1,
-1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 1, -1, -1, -1, 1, -1, -1
};
m = 10;
n = 10;
index = 0;
for( i = 1; i <= m; i++ )
{
for( j = 1; j <= n; j++ )
{
a[i][j] = my_array[index++];
}
}
x1 = 0; x2 = 0; y1 = 0; y2 = 0;
S = INT_MIN;
for(z = 1; z <= m; z++)
{
for(i = 1; i <= n; i++)
column[z - 1][i] = 0;
for(x = z; x <= m; x++)
{
t = 0; s = INT_MIN; k = 0; l = 0;
j = 1;
for(i = 1; i <= n; i++)
{
column[x][i] = column[x - 1][i] + a[x][i];
t = t + column[x][i];
if(t > s)
{
s = t; k = i; l = j;
}
if(t < 0)
{
t = 0;
j = i + 1;
}
}
if(s > S)
{
S = s; x1 = x; y1 = k; x2 = z; y2 = l;
}
}
}
printf("\n");
printf("Riga 1 -> %d\n", x2 - 1);
printf("Colonna 1 -> %d\n\n", y2 - 1);
printf("Riga 2 -> %d\n", x1 - 1);
printf("Colonna 2 -> %d\n\n", y1 - 1);
/* printf("Somma -> %d\n\n", S); */
return EXIT_SUCCESS;
}
Gli indici restituiti sono a base zero.
indica la seconda colonna.