Cod sursa(job #441082)

Utilizator _anonymousOnose Cristi _anonymous Data 12 aprilie 2010 19:10:57
Problema Gutui Scor 0
Compilator cpp Status done
Runda teme_upb Marime 2.92 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;
int b[256][256];




//functie care returneaza minimul intre 4 int-uri sau 3
//in functie de bool romb;
int min(bool romb,int a, int b, int c, int d)
{
    int minim;
    minim = a;
    if ( b < minim ) minim = b;
    if ( c < minim ) minim = c;
    if ( romb ) if ( d < minim ) minim = d;
    return minim;
}

void problema(char figura, int n, FILE *g)
{

	//in functie de parametrul 'figura' trimis functiei
	//se calculeaza patrate sau romburi
    int _figura = 0;
    switch (figura)
    {
    case 'P':
        _figura = 1;
        break;
    case 'R':
        _figura = 2;
        break;
    }

	//latura_max -> latura maxima a unei figuri(fie patrat fie romb)
	//nr_max -> numarul maxim de figuri de latura maxima
    int latura_max = 0, nr_max = 0, i, j;

    for (i=0; i<n; i++)
        for (j=0; j<n; j++)
        {
            if ( b[i][j] == 1 )
            {
                /*
                daca b[i][j] este 1 se reinitializaeaza b[i][j] cu minimul
                dintre : - stanga sus
                 		   - sus
                 		   - stanga
                 		   pt patrat
                    si  - sus stanga
                    	- sus dreapta
                    	- sus
                    	- 2x sus
                   	pt romb
                 astfel avand pe pozitia b[i][j] lungimea maxima pt un romb
                 sau patrat in acea pozitie
                 */
                if ( _figura == 1 ) b[i][j] = min(false, b[i][j-1], b[i-1][j], b[i-1][j-1], 0 ) + 1;
                if ( _figura == 2 ) b[i][j] = min(true, b[i-1][j-1],b[i-1][j],b[i-1][j+1],b[i-2][j])+1;
                if ( b[i][j] > latura_max )
                {
                    //daca se gaseste alt maxim
                    //el devine noul maxim
                    //contorul figurilor fiind resetat
                    nr_max = 1;
                    latura_max = b[i][j];
                }
                else   if ( b[i][j] == latura_max ) nr_max++; // se incrementeaza contorul figurilor
            }
        }
    fprintf(g,"%d %d",latura_max, nr_max);
}
int main()
{

    FILE *in;
    in=fopen("figuri2.in","r");

    FILE *g;
    g=fopen("figuri2.out","w");

    int n;
    char x;
    int i=0, j=0;
    int c[256][256];

    fscanf(in,"%d",&n);


    for ( i=0; i<n; i++ ){
        fscanf(in,"\n");
        for ( j=0; j<n; j++ )
        {
            fscanf(in,"%c",&x);

            c[i][j] = x -'0';
            b[i][j] = x -'0';
        }
    }

    fclose(in);

	//calcul patrate
    problema('P', n, g);

	//se reface matricea initiala pt a apela
	//functia cu parametru R pt calculul
	//figurilor romb
    fprintf(g,"\n");

	for (i=0; i<n; i++)
        for (j=0; j<n; j++) b[i][j] = c[i][j];
	//calcul romburi
    problema('R', n, g);

	fclose(g);
    return 0;
}