Cod sursa(job #435811)

Utilizator lavinia.bBobonete Lavinia lavinia.b Data 7 aprilie 2010 21:22:53
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 2.33 kb
#include<stdio.h>
#include<stdlib.h>

unsigned char min(unsigned char a,unsigned char b,unsigned char c)
		{
			if(a<=b && a<=c) return a;
			if(b<=a && b<=c) return b;
			return c;
		}

unsigned char minim(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
	{
		if(a<=b && a<=c && a<=d) return a;
		if(b<=a && b<=c && b<=d) return b;
		if(c<=a && c<=b && c<=d) return c;
		return d;
	}



int main()
	{
		FILE *in;
		FILE *out;
		in=fopen("figuri2.in","r");
		out=fopen("figuri2.out","w");
		int N;
		fscanf(in,"%d",&N);
       	unsigned char mat[N][N];
		unsigned char patrat[N][N];
		unsigned char romb[N][N];
		int max=0,i,j,Rmax=0;
        int nr_patrate=0,nr_romburi=0;
		int k=0;

        for(i=0;i<N;i++)
            fscanf(in,"%s",mat[i]);
        for(i=0;i<N;i++)
        	for(j=0;j<N;j++)
        		mat[i][j]=mat[i][j]-48;

		for(i=0;i<N;i++)
		{
			patrat[0][i]=mat[0][i];
			patrat[i][0]=mat[i][0];
			if((patrat[0][i] ==1)||(patrat[i][0]==1))
				max=1;

			romb[0][i]=mat[0][i];
			romb[i][0]=mat[i][0];
			romb[1][i]=mat[1][i];
			romb[i][N-1]=mat[i][N-1];

			if((romb[0][i] ==1)||(romb[i][0]==1)||(romb[1][i]==1)||(romb[i][N-1]==1))
				Rmax=1;
		}

		for(i=1;i<N;i++)
		{
			for(j=1;j<N;j++)
			{

				if(mat[i][j]==0)
				{
					patrat[i][j]=0;
					romb[i][j]=0;
				}
				else
				{
					patrat[i][j]=min(patrat[i][j-1]+1,patrat[i-1][j]+1,patrat[i-1][j-1]+1);
					if(i!=1)
						if(j!=(N-1))
							romb[i][j]=minim(romb[i-1][j-1]+1,romb[i-1][j]+1,romb[i-1][j+1]+1,romb[i-2][j]+1);
					if(patrat[i][j]==max)
						nr_patrate++;
					if(romb[i][j]==Rmax)
						nr_romburi++;

					if(patrat[i][j]>max)
					{
						nr_patrate=0;
						max=patrat[i][j];
					}

					if(romb[i][j]>Rmax)
					{
						nr_romburi=0;
						Rmax=romb[i][j];
					}
				}
			}
		}
		if(max==1)
		{
			for(i=0;i<N;i++)
				for(j=0;j<N;j++)
					if(patrat[i][j]==1)
						k++;
			fprintf(out,"1 %d\n",k);

		}
		else
		{
			if(max>0)
			{
				fprintf(out,"%d %d\n",max,(nr_patrate+1));
			}
		}

		k=0;
		if(Rmax==1)
		{
			for(i=0;i<N;i++)
				for(j=0;j<N;j++)
					if(romb[i][j]==1)
						k++;
			fprintf(out,"1 %d\n",k);
		}
		else
		{
			if(Rmax>0)
			{
				fprintf(out,"%d %d",Rmax,(nr_romburi+1));
			}
		}

    fclose(in);
    fclose(out);
    return 0;
	}