Cod sursa(job #435455)

Utilizator dan_grigoriuDan Grigoriu dan_grigoriu Data 7 aprilie 2010 14:56:15
Problema Gutui Scor 0
Compilator cpp Status done
Runda teme_upb Marime 2.43 kb
#include <stdio.h>
#include <iostream.h>
int min(int a, int b, int c)
{
   int m=a;
   if (m>b) m=b;       //min dintre a si b
   if (m<c) return m;
      else return c;   //min dintre toate 3
}
int min_r(int a, int b, int c, int d)
{
   int m=a;
   if (m>b) m=b;   //min dintre a si b
   if (m>c) m=c;   //min dintre a si b si c
   if (m<d) return m;
      else return d;//minimul tuturor
}
int main()
{
    int n=5,m_p[257][257],m_r[257][257],i,j,max_p[257],max_r[256],mp=0,mr=0;
    char *s,s1[256];
    for(i=0;i<=256;i++)
    for(j=0;j<=256;j++)m_p[i][j]=0;
    FILE *f1=fopen("figuri2.in","r");
    FILE *f2=fopen("figuri2.out","w");
    fscanf(f1,"%d\n",&n);
    for(i=0;i<n;i++)
    {
       s=fgets(s1,257,f1);       
       for(j=0;j<n;j++)
       {
          m_p[i][j]=s[j]-'0';    //imi construiesc simultan matricile m_p si m_r care vor fi folosite pentru
          m_r[i][j]=m_p[i][j];   //cazurile in care caut patrate, respectiv romburi
       }       
    }
    for(i=1;i<n;i++)
       for(j=1;j<=n;j++)
          if (m_p[i][j]==1)
          {  //patratul nou poate fi obtinut prin patratele deja existente de deasupra sa, in stanga si in stanga-susul lui
             m_p[i][j]=min(m_p[i-1][j-1],m_p[i][j-1],m_p[i-1][j])+1;
             if (m_p[i][j]>mp) mp=m_p[i][j];    //mp=latura maxima a patratului
             if (m_p[i][j]==mp) max_p[mp]++;    //m_p[i]=numar patrate de latura i; oarecum, pentru ca pe mine ma intereseaza
         //doar numarul de patrate de lungime maxima, deci celelalte valori vor fi incomplete pe masura ce se obtin laturi mai mari 
          }
    /*for(i=0;i<n;i++)
    {
       for(j=0;j<n;j++){}
          printf("%d",m_p[i][j]);
       printf("\n");       
    }*/
    fprintf(f2,"%d %d\n",mp,max_p[mp]);
    for(i=2;i<n;i++)
       for(j=1;j<n;j++)
          if (m_r[i][j]==1)
          {  //noul romb este obtinut din romburile din stanga-sus, sus, dreapta sus, si 2 pozitii deasupra
             m_r[i][j]=min_r(m_r[i-1][j-1],m_r[i-1][j+1],m_r[i-1][j],m_r[i-2][j])+1;
             //e nevoie de alta functie de minim pentru ca calculez minimul a 4 valori
             if (m_r[i][j]>mr) mr=m_r[i][j];              //similar ca in cazul patratelor
             if (m_r[i][j]==mr) max_r[mr]++;
          }     
    fprintf(f2,"%d %d",mr,max_r[mr]);  
    printf("%d %d ",m_p[254][253],m_p[254][253]);
    system("pause");
    fclose(f1);fclose(f2);
    return 0;    
}