Cod sursa(job #2055193)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 2 noiembrie 2017 22:33:25
Problema Barbar Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <stdio.h>
#include <stdlib.h>
int f[1002][1002],x[1000001],y[1000001],x1,y1,x2,y2,n,m,drag;
int cx[1000001],cy[1000001];
char v[1001];
int dx[4]={-1,0,+1,0};
int dy[4]={0,+1,0,-1};
int lee(int k)
{
    int z,i,j,fl,p,u,nr,uc;
    fl=1;
    for(z=1; z<=drag && fl && k; z++)
    {
        p=u=1;
        cx[1]=x[z];
        cy[1]=y[z];
        f[x[z]][y[z]]=2;
        nr=k-1;
        while(nr && 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()
{
    int i,j,pas,rez;
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d",&n,&m);
    drag=0;
    for(i=1; i<=n; i++){
        scanf("%s",v);
        for(j=1; j<=m; j++)
            switch(v[j-1])
            {
                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;
            }
        getchar();
    }
    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--;
    }
    printf("%d",rez);

    return 0;
}