Cod sursa(job #436190)

Utilizator Elena.Elena Diana Elena. Data 8 aprilie 2010 11:35:27
Problema Gutui Scor 0
Compilator cpp Status done
Runda teme_upb Marime 3.53 kb

#include <stdio.h>
#include <stdlib.h>

//functie care calculeaza minimul dintre 3 numere intregi

int minim(int a, int b, int c){
    int min;
    if(a<b)
           min=a;
    else
           min=b;
    if(min<c)
             return min;
    else
             return c;
           }
//functie care calculeaza elem maxim dintr-o matrice
int maxim(int a[257][257], int n){

	int i,j;
	int max = a[0][0];
	
	for(i =0; i<n; i++)
		for(j = 0; j<n; j++)
		
			if(max < a[i][j])
				max = a[i][j];
				
	return max;
	
}
int main(){
    int i,j,n;
    int a[257][257], best[257][257];
    FILE* f=fopen("figuri2.in","r");
    FILE* g=fopen("figuri2.out","w");
    char x[257];
    fscanf(f,"%d",&n);
    i=0;
	fgets(x,sizeof(x),f);
  //citire date de intrare : folosind fgets, am citit cate o linie din fisier intr-un sir  
	while((fgets(x,sizeof(x),f))!=NULL){
		for(j = 0; j<n; j++){
			if(x[j] == '1')
				a[i][j] = 1;
			if(x[j] == '0')
				a[i][j] = 0;
		}
		i++;
	}
	
	
    /* for(i=1;i<=n;i++)
     {   for(j=1;j<=n;j++)
        printf("%d ",a[i][j]);
        printf("\n");
    }*/
     
      /*             patrat             */
       
    //construim matricea best
    for(i=0;i<n;i++)
     for(j=0;j<n;j++){
                      if(j==0 || i==0) //prima linie si prima coloana din matricea a se copiaza in matricea best
                              best[i][j]=a[i][j];
                      else
                          if(a[i][j] == 0)
                                     best[i][j]=0;
                          else 
                              
                                     best[i][j]=1+minim(best[i-1][j], best[i][j-1], best[i-1][j-1]);//calculez lungimea laturii patratului, folosind o formula de recurenta care ne-a fost prezentata si la laborator 
                               }
                            // printf("\n");
    /*for(i =1; i <=n ;i++)
     {   for(j =1 ;j<=n;j++)
        printf("%d ",b[i][j]);
        printf("\n");*/
   int NP=0,LP;	
   LP=maxim(best,n); 
   for(i=0;i<n;i++)
     for(j=0;j<n;j++){
                       if(LP==best[i][j])
                                       NP++;
                                       }  
     fprintf(g,"%d %d\n", LP,NP);
     
     
   /*              romb           */
   
   //initializare matrice
    for(i = 0; i <n; i ++)
    for(j = 0; j <n; j ++)
			best[i][j] = 0;
						
	for(i = 0; i <n; i ++){
        best[i][0] = a[i][0];
		best[i][n-1] = a[i][n-1];
		best[0][i] = a[0][i];
		best[1][i] = a[1][i];
		}

for(i = 2; i <n; i ++)
		for(j = 1; j <n-1; j++)
		      if(a[i][j] == 1){
                       best[i][j]=1+minim(best[i-1][j-1],best[i-1][j+1],best[i-2][j]);}
   /*for(i =0; i <n ;i++)
     {   for(j =0 ;j<n;j++)
        printf("%d ",best[i][j]);
        printf("\n");}*/
    //verific care este patratul de lungime maxima
    //int max=1, p,q,nr=0;
    int LR,NR=0;
    LR=maxim(best,n);
    
 
     //verific cate patrate de lungime maxima pot fi in matrice
     //am folosit un contor (nr) pe care il incrementez de fiecare data cand gasesc in matricea best lungimea maxima a laturii patratului (care se afla pe pozitia coltului stanga jos al patratului)                              }
    
    for(i=0;i<n;i++)
     for(j=0;j<n;j++){
                       if(LR==best[i][j])
                                       NR++;
                                       }                      
      fprintf(g,"%d %d", LR,NR);
      fclose(f);
      fclose(g);
      return 0;
     }