Cod sursa(job #855858)

Utilizator raulstoinStoin Raul raulstoin Data 15 ianuarie 2013 18:38:23
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
using namespace std;
#include <fstream>
ifstream eu("insule.in");
ofstream tu("insule.out");
int dx[]={0,0,1,-1};int dy[]={1,-1,0,0};
int N,M,A[105][105],nrR,nrG,nrB,k,L[105*105],C[105*105],L1[105*105],C1[105*105],k1,Min=105*105;
void fill(int x,int y,int pas)
{
if(A[x][y]==pas)
{
    A[x][y]=-1;
    fill(x,y+1,pas);
    fill(x,y-1,pas);
    fill(x+1,y,pas);
    fill(x-1,y,pas);
}
if(A[x][y]==0&&pas==1)
{
k++;L[k]=x;C[k]=y;
}
if(A[x][y]==0&&pas==2)
{
k1++;L1[k1]=x;C1[k1]=y;
}

}
int main()
{
char c;int i,j,x,y,xnou,ynou,l;
eu>>N>>M;

for(i=1;i<=N;i++)
    for(j=1;j<=M;j++)
      {
      eu>>c;
      A[i][j]=c-48;
      }

for(i=0;i<=N+1;i++)
    A[i][0]=A[i][M+1]=-1;
for(i=0;i<=M+1;i++)
    A[0][i]=A[N+1][i]=-1;

for(i=1;i<=N;i++)
    for(j=1;j<=M;j++)
    {
        switch (A[i][j])
        {
        case 1: fill(i,j,1); nrR++;break;
        case 2: fill(i,j,2); nrG++;break;
        case 3: fill(i,j,3); nrB++;break;
        }

    }

for(i=1;i<=k;i++)
{
    x=L[i];y=C[i];
    for(l=0;l<4;l++)
    {
        xnou=x+dx[l];
        ynou=y+dy[l];
        if(A[xnou][ynou]==0)
        {
            A[xnou][ynou]=A[x][y]+1;
            k++;
            L[k]=xnou;C[k]=ynou;
        }
    }
}
for(i=1;i<=k1;i++)
{
    Min=min(Min,A[L1[i]][C1[i]]);

}
tu<<nrR<<" "<<nrG<<" "<<nrB<<" "<<Min<<"\n";
    return 0;
}