Pagini recente » Cod sursa (job #2241907) | Cod sursa (job #1941863) | Cod sursa (job #2190032) | Cod sursa (job #991599) | Cod sursa (job #438881)
Cod sursa(job #438881)
// Voiculescu Rafaela 321CA
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
//deschidere fisier de intrare, respectiv fisier de iesire
FILE *in,*out;
in=fopen("figuri2.in","r");
out=fopen("figuri2.out","w");
int M,N; //3<=N<=255
fscanf(in,"%d",&N);
fgetc(in); //citim sfarsitul
M=N+1;
int i,j,min,lat=0,nr=0;
unsigned char **a,**b;
//alocare spatiu matrice
a=(unsigned char **) calloc(M,sizeof(unsigned char*));
for(i=0;i<M;i++)
a[i]=(unsigned char *) calloc(M,sizeof(unsigned char));
b=(unsigned char **) calloc(M,sizeof(unsigned char*));
for(i=0;i<M;i++)
b[i]=(unsigned char *) calloc(M,sizeof(unsigned char));
//citire matrice
for(i=0;i<N;i++)
{
fgets((char*)a[i],M,in);
strcpy((char*)b[i],(char*)a[i]);
fgetc(in); //citim sfarsitul
}
for(i=0;i<N;i++) //modificam valorile astfel incat in matrice sa avem fie 1 fie 0 (numere nu caractere)
for(j=0;j<N;j++)
{
a[i][j]-='0';
b[i][j]-='0';
}
//pentru patrat
for(i=N-1;i>=0;i--)
for(j=N-1;j>=0;j--)
if(a[i][j]!=0)
{
min=a[i][j+1];
if(a[i+1][j]<min)
min=a[i+1][j];
if(a[i+1][j+1]<min)
min=a[i+1][j+1];
a[i][j]=min+1;
if(a[i][j]>lat) //daca s-a gasit un patrat de latura mai mare decat aveam pana acum
{
lat=a[i][j]; //se retine noua dimensiune pentru latura
nr=1; //se retine ca momentan avem decat 1 astfel de patrat
}
else
if(a[i][j]==lat) //am gasit un patrat cu latura de val maxima (temp)
nr++; //incrementam numarul patratelor cu aceasta latura
}
//afisare LP, NP
fprintf(out,"%d %d\n",lat,nr);
//eliberare memorie pentru matricea a
for(i=0;i<N;i++)
free(a[i]);
free(a);
lat=nr=0; //le setam 0 pentru a calcula acum pentru romb
//pentru romb
for(i=N-2;i>=0;i--)
for(j=N-1;j>0;j--)
if(b[i][j]!=0 && b[i+1][j]!=0)
{
min=b[i+1][j-1];
if(b[i+1][j+1]<min)
min=b[i+1][j+1];
if(b[i+2][j]<min)
min=b[i+2][j];
b[i][j]=min+1;
if(b[i][j]>lat) //daca s-a gasit un patrat de latura mai mare decat aveam pana acum
{
lat=b[i][j]; //se retine noua dimensiune pentru latura
nr=1; //se retine ca momentan avem decat 1 astfel de patrat
}
else
if(b[i][j]==lat) //am gasit un patrat cu latura de val maxima (temp)
nr++; //incrementam numarul patratelor cu aceasta latura
}
//afisare LR, NR
fprintf(out,"%d %d\n",lat,nr);
//eliberare memorie pentru matricea b
for(i=0;i<N;i++)
free(b[i]);
free(b);
//inchidere fisiere
fclose(in);
fclose(out);
return 0;
}