codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define FILE_IN "file_in.txt"
#define MAXR 50
int leggiMatrice(int maxr, int m[][maxr], int *r, int *c);
int riconosciRegione(int nr, int nc, int M[][nc],int r, int c, int *bp, int *hp);
int main()
{
int b,h,i,j,nr,nc,p;
int regione=1;
int M[MAXR][MAXR];
p = leggiMatrice(MAXR,M,&nr,&nc);
if(p==-1)
{
printf("ERRORE: impossibile aprire %s.", FILE_IN);
exit(-2);
}
if(p==0)
{
printf("ERRORE: le dimensioni della matrice devono essere al piu' %d x %d.", MAXR, MAXR);
exit (-1);
}
for(i=0; i<nr; i++)
for(j=0; j<nc; j++)
if(riconosciRegione(nr,nc,M,i, j, &b, &h)==1)
{
printf("Regione %d: estr. sup. SX = <%d,%d> b = %d, h = %d, Area = %d\n", regione, i, j, b, h, b*h);
regione++;
}
return 0;
}
int leggiMatrice(int maxr, int m[][maxr], int *r, int *c)
{
int i,j;
FILE *fr;
fr=fopen(FILE_IN, "r");
if(fr==NULL)
return -1;
fscanf(fr, "%d %d", &(*r), &(*c));
if((*r) > maxr || (*c) > maxr)
return 0;
for(i=0; i<(*r); i++)
for(j=0; j<(*c); j++)
fscanf(fr, "%d ", &m[i][j]);
fclose(fr);
return 1;
}
int riconosciRegione(int nr, int nc, int M[][nc], int r, int c, int *bp, int *hp)
{
int i,j,k,l,flag;
i=r;
j=c;
if(M[i][j] == 1)
{
flag=1;
for((*bp)=0,k=0; (j+k)<nc && flag==1; k++)
{
if(M[i][j+k] == 1)
(*bp)++;
else
flag=0;
}
flag=1;
for(k=1,(*hp)=1; (k+i)<nr && flag==1; k++)
{
for(l=0; l<(*bp) && flag==1; l++)
if(M[i+k][j+l] != 1)
flag=0;
if(flag==1)
(*hp)++;
}
for(i=0; i<(r+(*hp)); i++)
for(j=c; j<(c+(*bp)); j++)
M[i][j]=-1;
return 1;
}
return 0;
}