Cod sursa(job #1734964)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 28 iulie 2016 16:30:23
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.06 kb
//Cine a facut sursa e BO$$
//Sursa by Ionut Anghelina
#include<bits/stdc++.h>
using namespace std;
deque<int> q1,q2;
int r,c,xi,yi,xf,yf,a[1005][1005],b[1005][1005],d[5][3],m[1005][1005],x,ls,ld,mid,y,sol;
char c1;
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d",&r,&c);
    for(int i=1;i<=r;i++)
    {
        scanf("\n");
        for(int j=1;j<=c;j++)
        {
            //m[i][j]=-1;
            scanf("%c",&c1);
            if (c1=='.')
            {
                b[i][j]=INT_MAX;
            }
                else
            if (c1=='I')
            {
                xi=i;
                yi=j;
                b[i][j]=INT_MAX;
            }
                else
            if (c1=='O')
            {
                xf=i;
                yf=j;
                b[i][j]=INT_MAX;
            }
                else
            if (c1=='D')
            {
                a[i][j]=-1;
                b[i][j]=0;
                q1.push_front(i);
                q2.push_front(j);
            }
                else
            {
                a[i][j]=-1;
                b[i][j]=-1;
            }
        }
    }
    d[1][1]=-1;
    d[1][2]=0;
    d[2][1]=1;
    d[2][2]=0;
    d[3][1]=0;
    d[3][2]=-1;
    d[4][1]=0;
    d[4][2]=1;
    for(int i=0;i<=(c+1);i++)
    {
        a[0][i]=a[r+1][i]=-2;
    }
    for(int i=0;i<=(r+1);i++)
    {
        a[i][0]=a[i][c+1]=-2;
    }
    while (!q1.empty())
    {
        for(int i=1;i<=4;i++)
        {
            {
                if (a[q1.front()+d[i][1]][q2.front()+d[i][2]]>=0)
                {
                    if (b[q1.front()+d[i][1]][q2.front()+d[i][2]]>(b[q1.front()][q2.front()]+1))
                    {
                        b[q1.front()+d[i][1]][q2.front()+d[i][2]]=b[q1.front()][q2.front()]+1;
                        q1.push_back(q1.front()+d[i][1]);
                        q2.push_back(q2.front()+d[i][2]);
                    }
                }
            }
        }
        q1.pop_front();
        q2.pop_front();
    }
    ls=0;
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
        {
            ld=max(ld,b[i][j]);
        }
    }
    sol=-1;
    int z=0;
    while (ls<=ld)
    {
        mid=(ls+ld)/2;
        if(b[xi][yi]>=mid)
        {
        q1.push_front(xi);
        q2.push_front(yi);
        z++;
        while (!q1.empty())
        {
            for(int i=1;i<=4;i++)
            {
                x=q1.front()+d[i][1];
                y=q2.front()+d[i][2];
                if (a[x][y]>(-1) && b[x][y]>=mid && m[x][y]!=z )
                {
                    m[x][y]=z;
                    q1.push_back(x);
                    q2.push_back(y);
                }
            }
            q1.pop_front();
            q2.pop_front();
        }
        if (m[xf][yf]==z)
        {
            sol=mid;
            ls=mid+1;
        }
            else ld=mid-1;
        } else ld=mid-1;
    }
    printf("%d\n",sol);
    return 0;
}