Cod sursa(job #1585603)

Utilizator adystar00Bunea Andrei adystar00 Data 31 ianuarie 2016 11:51:11
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <iostream>
#include <fstream>
using namespace std;
struct codix
{
    int l,c;
};
codix coada[1000000];
int a[1001][1001],b[1001][1001],m,n,pl,pc,cl,cc,dx[4]= {-1,0,1,0},dy[4]= {0,1,0,-1},ck;
void fill (int i, int j, int xx, int yy)
{
    int lx,cx;
    b[i][j]=yy;
    for(int k=0; k<4; k++)
    {
        lx=i+dx[k];
        cx=j+dy[k];
        if(lx>0&&cx>0&&lx<=n&&cx<=m&&b[lx][cx]!=yy&&a[lx][cx]>=xx)
            fill(lx,cx,xx,yy);
    }
}
bool check (int val)
{
    ck--;
    fill(pl,pc,val,ck);
    if(b[cl][cc]==ck)
        return true;
    return false;
}
int main()
{
    ifstream fin ("barbar.in");
    ofstream fout ("barbar.out");
    int i,j,sf=0,ic,x,y,pas;
    char c;
    fin>>n>>m;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            fin>>c;
            if(c=='.')
                a[i][j]=0;
            if(c=='*')
                a[i][j]=-2;
            if(c=='D')
            {
                a[i][j]=0;
                sf++;
                coada[sf].l=i;
                coada[sf].c=j;
            }
            if(c=='I')
            {
                pl=i;
                pc=j;
                a[i][j]=-3;
            }
            if(c=='O')
            {
                cl=i;
                cc=j;
                a[i][j]=1025;
            }
        }
    ic=1;
    while(ic<=sf)
    {
        ic++;
        for(i=0; i<4; i++)
        {
            x=coada[ic].l+dx[i];
            y=coada[ic].c+dy[i];
            if(ic==1)
                cout<<x<<" "<<y<<" "<<a[x][y]<<" "<<ic<<" "<<sf<<"\n";
            if(x>0&&y>0&&x<=n&&y<=m&&a[x][y]==0)
            {
                sf++;
                coada[sf].l=x;
                coada[sf].c=y;
                a[x][y]=a[coada[ic].l][coada[ic].c]+1;
            }
        }
    }
    i=0;
    pas=1<<10;
    while(pas!=0)
    {
        if(check(i+pas)==1)
            i+=pas;
        pas/=2;
    }
    fout<<i-1;
    return 0;
}