Cod sursa(job #441560)

Utilizator zdocAnghel Dan-Adrian zdoc Data 12 aprilie 2010 23:16:35
Problema Gutui Scor 0
Compilator cpp Status done
Runda teme_upb Marime 3.84 kb
#include<stdio.h>
#include<stdlib.h>





int **M;
int **Mr;
int **mat;
FILE *f;


int** allocMatrix(int N)
{
	int i;
	int **matr = (int**)malloc(255*sizeof(int*)); // aloca memorie pt n linii
	for(i=0;i<N;++i)
		matr[i] = (int*)malloc(255*sizeof(int)); // aloca coloanele pt fiecare linie
	return matr;
}




int** readMatrix(const char* fis,int* N){
	int i,j;

	FILE* f = fopen(fis,"r");

	fscanf(f,"%d",N); // citesc numarul de linii si de coloane




	for(i=0;i<(*N);i++)
	{

		for (j=0;j<(*N);j++)
		{

		fscanf(f,"%01d",&mat[i][j]);

		}
	}
	fclose(f);
	return mat;
}


void printMatrix(int N){
	int i,j,maxp=0,k=0, maxr=0, p=0;
	
	
	
		for(i=0; i<N; ++i)
		{
			for (j=0; j<N; j++)
			{

			
			     if (M[i][j] > maxp)
			     {
				    maxp = M[i][j];
                    k=1; // in k retin numarul de patrate cu latura maxima
                                 
                 }
                 else if (M[i][j] == maxp)
                    k++;
                 if (Mr[i][j] > maxr)
			     {
				    maxr = Mr[i][j];
                    p=1; // in p retin numarul de romburi cu latura maxima
                                 
                 }
                 else if (Mr[i][j] == maxr)
                    p++;
             }
             
             
			
		}
		fprintf(f,"%d ", maxp);
        fprintf(f,"%d\n", k);
       	fprintf(f,"%d ", maxr);
        fprintf(f,"%d", p);
	

}




// minimul pentru patrat :
           
int minim(int** mat,int i,int j)
{
	int min=1000;

		if ( mat[i][j] == 0 )
			{
				return 0;
			}
	   if( i == 0 || j == 0 ) // in cazul cand nu sunt vecini
		{
				return mat[i][j];
		}
		 if ( mat [i][j] == 1) 
			{

                    //pentru patrat calculez minimul vecinilor
               if (mat[i][j-1] && mat[i-1][j-1] && mat[i-1][j])
               {
					if (M [i][j-1] < min)
                    {
                           min = M[i][j-1];
                    }

					if (M [i-1][j-1] < min)
                    {
                          min = M[i-1][j-1];
                    }

					if (M [i-1][j] < min) 
                    {
                          min = M[i-1][j];
                    }
     
					return min+1;
                }
                return 1;	

			}

		 return 0;
}


// minimul pentru romb :
           
int minimr(int** mat,int i,int j,int n)
{
	int min=1000;

		if ( mat[i][j] == 0 )
			{
				return 0;
			}
	   if( i == 0 || j == 0 || j==n-1) // in cazul cand nu sunt vecini
		{
				return mat[i][j];
		}
		 if ( mat [i][j] == 1) 
			{                    
                    // pentru romb aflu minimul dintre vecinii de deasupra
                    
                    if (mat [i-1][j-1] == 1 && mat [i-1][j] == 1 && mat [i-1][j+1] == 1)
                   {
                       if (Mr[i-1][j-1] < min)
                       {
                                       min = Mr[i-1][j-1];
                       }
                       if (Mr[i-1][j] < min)
                       {
                                     min = Mr[i-1][j];
                       }
                       if (Mr[i-1][j+1] < min)
                       {
                                       min = Mr[i-1][j+1];
                       }
                      
                       
                   }
                    else
                        return 1;

					 
					
					if (i-2*min >=0 && mat [i-2*min][j] == 1)
					
                       {
                               return min+1;
                       }

                       return min;
			}

		 return 0;
}


int main ()
{
	int N=3,i,j;
	
	mat = allocMatrix(255);
    mat = readMatrix("figuri2.in",&N);
	M = allocMatrix(N);
	Mr = allocMatrix(N);
    f = fopen("figuri2.out","w");
	
	for (i=0; i<N; i++)
	{
		for (j=0; j<N; j++)
		{
			M[i][j] = minim(mat, i, j);
		
			Mr[i][j] = minimr(mat, i, j, N);
			
		
		}
		printf("\n");
}
    printMatrix(N);
 	
	fclose(f);
    
  return 0;
}