Cod sursa(job #441361)

Utilizator arrowedgeDragos Dinu arrowedge Data 12 aprilie 2010 21:32:41
Problema Gutui Scor 0
Compilator cpp Status done
Runda teme_upb Marime 3.68 kb
#include<stdio.h>
#include<stdlib.h>
void read(char* file_name, int *n, int ***a) { //functie de citire
	int i, j;
	FILE *fd = fopen(file_name, "r");
	
	// dimensiune matrice
	fscanf(fd, "%i", n);
    
	// elementele matricei A
	*a = (int**)malloc((*n) * sizeof(int*));
	for (i = 0; i < *n; i++) {
		(*a)[i] = (int*)malloc((*n) * sizeof(int));
		for (j = 0; j < *n; j++) {
			fscanf(fd, "%i", &((*a)[i][j]));
		}
	}
	fclose(fd);
}

void write(FILE* fd, int n, int **a){ //functie de scriere
     int i,j;
     int max = 1;
     int contor = 0;
     for(i = 0; i < n; i++)
       for(j = 0; j < n; j++){
        if(a[i][j] > max){
                   max = a[i][j]; // schimbam maximul
                   contor = 0; // resetam contorul
                   }
        if(a[i][j] == max)
                   contor = contor + 1;
        }
        fprintf(fd, "%i %i\n", max, contor);
     }
     
int min(int a, int b, int c){
    if (a < b)
      if (a < c)
         return a;
      else 
         return c;
    else
      if (b < c)
         return b;
      else
         return c;
    }
    
int min2(int a, int b, int c, int d){
    int v[4];v[0]=a;v[1]=b;v[2]=c;v[3]=d;
    int i,aux;
    int schimb; 
    do{
        schimb=0;
    for(i=1;i<4;i++)
     if(v[i]<v[i-1]){
       aux=v[i-1];
       v[i-1]=v[i];
       v[i]=aux;
     schimb = 1;
     }
     }while(schimb);
     return v[0];
}

int contains(int k,int **matrix,int N){
    int i,j;
    for (i = 0; i < N; i++)
          for (j = 1; j < N; j++)
            if(matrix[i][j] == k)
              return 1;
    return 0;
}

int main(){
    
    int i = 0, j = 0;
    
    
    int N;
    int **matrix = NULL;
    char* in_file = "figuri2.in";
    char* out_file = "figuri2.out";
    
    read(in_file, &N, &matrix);
    
    FILE *fout = fopen(out_file, "w");   //fisierul de iesire
    
    //pt patrat
    int **aux;
    aux = (int**)malloc(N * sizeof(int*));
    for (i = 0; i < N; i++) 
        aux[i] = (int*)malloc(N * sizeof(int));                   //construim o matrice auxiliara care va tine evidenta laturilor maxime ale 
                                                                    //patratelor,unde aux[i][j] va fi varful din dreapta jos al patratului de latura aux[i][j]
    
    
    for (i = 0, j = 0; j < N; j++) aux[i][j] = matrix[i][j];        //copiem prima linie 
    for (i = 1, j = 0; i < N; i++) aux[i][j] = matrix[i][j];        //copiem prima coloana
    
    for (i = 1; i < N; i++)
       for (j = 1; j < N; j++)
          if (matrix[i][j] == 0)
             aux[i][j] = 0;
          else 
             aux[i][j] = min(aux[i-1][j], aux[i-1][j-1], aux[i][j-1]) + 1;
              
     write(fout, N, aux);
    
    
    //pt romb
     int **aux2;
      aux2 = (int**)malloc(N * sizeof(int*));
	  for (i = 0; i < N; i++) {
		aux2[i] = (int*)malloc(N * sizeof(int));
		for (j = 0; j < N; j++) 
			 aux2[i][j]=matrix[i][j];           //construiesc o noua matrice auxiliara pt romb,initial are valoarea lui matrix
		
	}
        
    int k=1;
   do{                                        //verific daca o pozitie oarecare din interiorul matricii poate fi un romb
    for (i = 1; i < N-1;i++)                  //ciclul do while se parcurge ori de cate ori se mareste raza unui romb,adica
       for (j = 1; j < N-1; j++)              //se gaseste unul mai mare
          if (aux2[i][j] == 0)
             aux2[i][j] = 0;
          else 
             aux2[i][j] = min2(aux2[i-1][j], aux2[i][j-1], aux2[i+1][j], aux2[i][j+1]) + 1;
     k++;
     }while(contains(k,aux2,N));                 
     
     write(fout, N, aux2);
        
    return 1;
}