Cod sursa(job #1758824)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 17 septembrie 2016 22:24:16
Problema Ferma Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <stdio.h>
#include <stdlib.h>
char a[402][402];
int rez[402][402],suma,nrord,cod[402][402];
int dl[4]={-1,0,+1,0};
int dc[4]={0,+1,0,-1};
int aux[4],auxrez[4],n,m;
char auxc[4],caux;
void fill(int l,int c){
    suma++;
    rez[l][c]=-1;
    if(l>1 && rez[l-1][c]==0 && a[l-1][c]==caux)
        fill(l-1,c);
    if(l<=n-1 && rez[l+1][c]==0 && a[l+1][c]==caux)
        fill(l+1,c);
    if(c>1 && rez[l][c-1]==0 && a[l][c-1]==caux)
        fill(l,c-1);
    if(c<=m-1 && rez[l][c+1]==0 && a[l][c+1]==caux)
        fill(l,c+1);
    cod[l][c]=nrord;
}
void fill2(int l,int c){
    rez[l][c]=suma;
    if(l>1 && rez[l-1][c]==-1 && a[l-1][c]==caux)
        fill2(l-1,c);
    if(l<=n-1 && rez[l+1][c]==-1 && a[l+1][c]==caux)
        fill2(l+1,c);
    if(c>1 && rez[l][c-1]==-1 && a[l][c-1]==caux)
        fill2(l,c-1);
    if(c<=m-1 && rez[l][c+1]==-1 && a[l][c+1]==caux)
        fill2(l,c+1);
}
int main()
{
    int v,l,c,i,j,max,maxrez,rezl,rezc,ct,k,ii,jj,kk;
    char crez;
    freopen("ferma.in","r",stdin);
    freopen("ferma.out","w",stdout);
    scanf("%d%d%d",&v,&l,&c);
    n=l;
    m=c;
    getchar();
    for(i=1; i<=l; i++){
        for(j=1; j<=c; j++)
            a[i][j]=getchar();
        getchar();
    }
    max=0;
    nrord=0;
    for(i=1; i<=l; i++)
        for(j=1; j<=c; j++)
        {
            suma=0;
            if(i==35 && j==13)
                ct=0;
            if(rez[i][j]==0){ nrord++; caux=a[i][j]; fill(i,j);
            fill2(i,j);}
            if(suma>max) max=suma;
        }
    if(v==1)
        printf("%d\n",max);
    maxrez=0;
    rezl=0;
    rezc=0;
    for(i=1; i<=l; i++)
        for(j=1; j<=c; j++){
            ct=0;
            if(i==34 && j==16)
                ct=0;
            for(k=0; k<4; k++){
                ii=i+dl[k];
                jj=j+dc[k];
                for(kk=0; kk<ct && aux[kk]!=cod[ii][jj]; kk++);
                if(kk==ct){aux[ct]=cod[ii][jj]; auxrez[ct]=rez[ii][jj]; auxc[ct]=a[ii][jj]; ct++;}
            }
            for(k=0; k<4; k++){
                ii=i+dl[k];
                jj=j+dc[k];
                if(a[ii][jj]!=0 && a[ii][jj]!=a[i][j]){
                    suma=0;
                    for(kk=0; kk<ct; kk++)
                        suma+=auxrez[kk]*(auxc[kk]==a[ii][jj]);
                    if(maxrez<suma+1)
                        maxrez=suma+1,crez=a[ii][jj],rezl=i,rezc=j;
                }
            }
        }
    if(v==2)
        printf("%d %d\n%c\n",rezl,rezc,crez);

    return 0;
}