Cod sursa(job #441545)

Utilizator didi23Tiriplica Diana didi23 Data 12 aprilie 2010 23:06:38
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 1.71 kb
#include <stdio.h>
#include <stdlib.h>	

int min (int a, int b)
{
	return a<b ? a : b;
}

int main (int argc, char **argv)
{
	FILE *fin, *fout;
	int **mat, **aux;
	char *linie;
	int n, i, j, m, max, cnt;
	
	fin = fopen ("figuri2.in", "r");
	fout = fopen ("figuri2.out", "w");
	
	fscanf (fin, "%d\n", &n);
	if (n<3 || n>255)
		return 1;
	mat = (int**)calloc(n+1, sizeof(int*));
	aux = (int**)calloc(n+1, sizeof(int*));
	linie = (char*)calloc(n+4, sizeof(char));
	
	for (i=0; i<=n; i++)
	{
		mat[i] = (int*)calloc(n+1, sizeof(int));
		aux[i] = (int*)calloc(n+1, sizeof(int));
	}
		
		
	for (i=1; i<=n; i++)
	{
		fgets (linie, n+4, fin);
		for (j=1; j<=n; j++)
			mat[i][j] = linie[j-1] - 48;
	}
	free(linie);
	/*
	for (j=0; j<n; j++)
	{
		aux[0][j] = mat[0][j];
		aux[j][0] = mat[j][0];
	}
	
	for (i=0; i<n; i++)
		for (j=0; j<n; j++)
			aux[i][j] = mat[i][j];
	*/
	
	max = 0;
	cnt = 0;
	for (i=1; i<=n; i++)
		for (j=1; j<=n; j++)
		{
			m = min (min (aux[i-1][j], aux[i][j-1]), aux[i-1][j-1]);
			if (mat[i][j] == 1)
				aux[i][j] = m + 1;
			if (aux[i][j] > max)
			{
				max = aux[i][j];
				cnt = 0;
			}
			if (aux[i][j] == max)
				cnt++;
		}
		
	fprintf (fout, "%d %d\n", max, cnt);
	
	for (i=0; i<=n; i++)
		for (j=0; j<=n; j++)
			aux[i][j] = mat[i][j];
	
			
	max = 0;
	cnt = 0;
	for (i=2; i<=n; i++)
		for (j=1; j<n; j++)
		{
			m = min (min (aux[i-1][j-1], aux[i-1][j+1]), aux[i-2][j]);
			if (mat[i][j] == 1 && mat[i-1][j] == 1)
				aux[i][j] = m + 1;
			if (aux[i][j] > max)
			{
				max = aux[i][j];
				cnt = 0;
			}
			if (aux[i][j] == max)
				cnt++;
		}
		
	fprintf (fout, "%d %d\n", max, cnt);
	
	fclose (fin);
	fclose (fout);
	for (i=0; i<=n; i++)
	{
		free (mat[i]);
		free (aux[i]);
	}
	free (mat);
	free (aux);
	return 0;
		
}