Cod sursa(job #2055498)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 3 noiembrie 2017 11:59:26
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
short f[1002][1002],x[1000001],y[1000001],x1,y1,x2,y2,n,m;
int drag;
short cx[1000001],cy[1000001];
short dx[4]={-1,0,+1,0};
short dy[4]={0,+1,0,-1};
short lee(short k)
{
    short j,fl,nr;
    int z,p,u,uc,i;
    p=1;
    u=0;
    for(z=1; z<=drag && k; z++)
    {
        u++;
        cx[u]=x[z];
        cy[u]=y[z];
        f[x[z]][y[z]]=2;
    }
    fl=1;
    nr=k-1;
    while(nr>0 && fl && p<=u)
    {
        uc=u;
        for(i=p; i<=u && fl; i++)
            for(j=0; j<4 && fl; j++)
                if(f[cx[i]+dx[j]][cy[i]+dy[j]]==0)
                    if(cx[i]+dx[j]==x1 && cy[i]+dy[j]==y1)
                        fl=0;
                    else
                        uc++,cx[uc]=cx[i]+dx[j],cy[uc]=cy[i]+dy[j],f[cx[uc]][cy[uc]]=2;
        p=u+1;
        u=uc;
        nr--;
    }
    if(fl==0)
    {
        for(i=1; i<=n; i++)
            for(j=1; j<=m; j++)
                if(f[i][j]==2)
                    f[i][j]=0;
        return 0;
    }
    f[x1][y1]=3;
    p=u=1;
    cx[p]=x1;
    cy[p]=y1;
    while(p<=u)
    {
        for(i=0; i<4; i++)
            if(f[cx[p]+dx[i]][cy[p]+dy[i]]==0)
                u++,cx[u]=cx[p]+dx[i],cy[u]=cy[p]+dy[i],f[cx[u]][cy[u]]=3;
        p++;
    }
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            if(f[i][j]==2)
                f[i][j]=0;
    if(f[x2][y2]==3)
        return 1;
    return 0;
}
int main()
{
    short i,j,pas,rez;
    char c;
    fin >> n >> m;
    drag=0;
    for(i=1; i<=n; i++){
        for(j=1; j<=m; j++)
        {
            fin>>c;
            switch(c)
            {
                case 'I': x1=i,y1=j; break;
                case '0': x2=i,y2=j; break;
                case 'O': x2=i,y2=j; break;
                case '*': f[i][j]=1; break;
                case 'D': drag++; x[drag]=i,y[drag]=j; break;
                default: break;
            }
        }
    }
    for(i=0; i<=n+1; i++)
        f[i][0]=f[i][m+1]=1;
    for(i=0; i<=m+1; i++)
        f[0][i]=f[n+1][i]=1;
    pas=1<<11;
    rez=0;
    while(pas)
    {
        if(lee(rez+pas))
            rez+=pas;
        for(i=1; i<=n; i++)
            for(j=1; j<=m; j++)
                if(f[i][j]==3)
                    f[i][j]=0;
        pas/=2;
    }
    if(rez==0)
    {
        rez=lee(0);
        rez--;
    }
    fout<<rez;

    return 0;
}