Cod sursa(job #1133582)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 5 martie 2014 07:14:31
Problema Ferma Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <algorithm>
#define Lmax 315

using namespace std;

struct grupa
{
    int arie,cul;
};
grupa v[Lmax*Lmax];

int a[Lmax][Lmax],nr[Lmax][Lmax],L,C,N,nrgr;
int dx[]={-1,-1,0,1,1, 1, 0,-1};
int dy[]={ 0, 1,1,1,0,-1,-1,-1};
bool viz[Lmax][Lmax];

inline void Fill(int i, int j)
{
    int t;
    ++v[nrgr].arie;
    viz[i][j]=true;
    for(t=0;t<8;++t)
        if(a[i+dx[t]][j+dy[t]]==a[i][j] && !viz[i+dx[t]][j+dy[t]])
            Fill(i+dx[t],j+dy[t]);
}

inline bool Cmp(const grupa A, const grupa B)
{
    if(A.cul==B.cul)
        return A.arie<B.arie;
    return A.cul<B.cul;
}

int main()
{
    int x1,x2,y1,y2,i,j,c,maxim=0;
    freopen ("figuri.in","r",stdin);
    freopen ("figuri.out","w",stdout);
    scanf("%d%d%d", &L,&C,&N);
    for(i=1;i<=L;++i)
        for(j=1;j<=C;++j)
            a[i][j]=1;
    while(N--)
    {
        scanf("%d%d%d%d%d", &x1,&y1,&x2,&y2,&c);
        x1+=L/2+1; y1+=C/2+1; x2+=L/2+1; y2+=C/2+1;
        for(i=x1;i<=x2;++i)
            for(j=y1;j<=y2;++j)
                ++nr[i][j];
        --x2; --y2;
        for(i=x1;i<=x2;++i)
            for(j=y1;j<=y2;++j)
                a[i][j]=c;
    }
    for(i=1;i<=L;++i)
        for(j=1;j<=C;++j)
            if(!viz[i][j])
            {
                ++nrgr;
                v[nrgr].cul=a[i][j];
                Fill(i,j);
            }
    sort(v+1,v+nrgr+1,Cmp);
    for(i=1;i<=nrgr;++i)
        printf("%d %d\n", v[i].cul,v[i].arie);
    for(i=1;i<=L;++i)
        for(j=1;j<=C;++j)
            maxim=max(maxim,nr[i][j]);
    printf("%d\n", maxim+1);
    return 0;
}