Cod sursa(job #438881)

Utilizator rafaela_vRafaela Voiculescu rafaela_v Data 11 aprilie 2010 02:13:10
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 3.19 kb
// 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;
}