Cod sursa(job #1183368)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 8 mai 2014 22:16:56
Problema Factorial Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("insule.in");
ofstream g("insule.out");
struct {int x,y;}c[100003],v,d;
const int dl[]={-1,0,1,0},dc[]={0,1,0,-1};
long int n,m,a[110][110],i,j,b[103][103],nr,nb,ng,minim=32000,mx;
char cho;
void read()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            f>>cho;a[i][j]=cho-'0';
            if(a[i][j]==2) a[i][j]=20000;
            b[i][j]=a[i][j];
        }
}
void bordare()
{
    for(i=0;i<=n+1;i++)
        a[i][0]=-1,a[i][m+1]=-1;
    for(i=0;i<=m+1;i++)
        a[0][i]=-1,a[n+1][i]=-1;
}
void flood(int j,int l)
{
    int inc,sf,i,k=b[j][l];
    b[j][l]=0;
    inc=sf=1;
    c[1].x=j;c[1].y=l;
    while(inc<=sf)
    {
        v=c[inc++];b[v.x][v.y]=0;
        for(i=0;i<4;i++)
        {
            d.x=v.x+dl[i];
            d.y=v.y+dc[i];
            if(b[d.x][d.y]==k)
            {
                c[++sf]=d;
                b[d.x][d.y]=0;
            }
        }
    }
    if(k==1) nr++;
    else if(k==20000) ng++;
    else if(k==3) nb++;
}
void lee(int j,int l)
{
    int inc,sf,i,k=0,gasit=0;
    inc=sf=1;
    c[1].x=j;c[1].y=l;
    while(inc<=sf && !gasit)
    {
        v=c[inc];
        for(i=0;i<4;i++)
        {
            d.x=v.x+dl[i];
            d.y=v.y+dc[i];
            if(a[d.x][d.y]==20000)
                gasit=1,k=a[c[inc].x][c[inc].y];
            if(a[d.x][d.y]==0)
            {
                a[d.x][d.y]=a[v.x][v.y]+1;
                c[++sf]=d;
            }
        }
        inc++;
    }
    k--;
    if(k>0 && k<minim)
        minim=k;
    a[c[1].x][c[1].y]=1;
    for(i=2;i<=sf;i++)
        a[c[i].x][c[i].y]=0;
}
int main()
{
    read();
    bordare();
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {if(b[i][j]) flood(i,j);
        if(a[i][j]==1) lee(i,j);}
    g<<nr<<" "<<ng<<" "<<nb<<" "<<minim;
    f.close();g.close();
    return 0;
}