Cod sursa(job #2031864)

Utilizator patcasrarespatcas rares danut patcasrares Data 3 octombrie 2017 22:15:40
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.14 kb
#include<fstream>
#include<iostream>
#include<queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,d[1005][1005],v[1005][1005],r[1005][1005],a,b,fl,fc,f,nr=3,ma;
char x[1005][1005];
queue<pair<int,int> >q;
int dl[4]={0,0,1,-1};
int dc[4]={1,-1,0,0};
int te(int x)
{
    if(x<0)
        return 0;
    return x;
}
void bfs1()
{
    int l,c,lnou,cnou;
    while(!q.empty())
    {
        l=q.front().first;
        c=q.front().second;
        q.pop();
        for(int de=0;de<4;de++)
        {
            lnou=l+dl[de];
            cnou=c+dc[de];
            if(lnou>=1&&cnou>=1&&lnou<=n&&cnou<=m)
                if(x[lnou][cnou]!='*')
                if(!v[lnou][cnou]||d[l][c]+1<d[lnou][cnou])
                {
                    d[lnou][cnou]=d[l][c]+1;
                    v[lnou][cnou]=1;
                    q.push(make_pair(lnou,cnou));
                }
        }
    }
}
void vef()
{
    int l,c,lnou,cnou;
    while(!q.empty())
    {
        l=q.front().first;
        c=q.front().second;
        q.pop();
        for(int de=0;de<4;de++)
        {
            lnou=l+dl[de];
            cnou=c+dc[de];
            if(lnou>=1&&cnou>=1&&lnou<=n&&cnou<=m)
                if(x[lnou][cnou]!='*')
                if(v[lnou][cnou]!=2)
                {
                    v[lnou][cnou]=2;
                    q.push(make_pair(lnou,cnou));
                }
        }
    }
}
void bfs2()
{
    int l,c,lnou,cnou;
    while(!q.empty())
    {
        l=q.front().first;
        c=q.front().second;
        q.pop();
        for(int de=0;de<4;de++)
        {
            lnou=l+dl[de];
            cnou=c+dc[de];
            if(lnou>=1&&cnou>=1&&lnou<=n&&cnou<=m)
                if(x[lnou][cnou]=='.'||x[lnou][cnou]=='O')
                if(v[lnou][cnou]!=nr&&d[lnou][cnou]>=f)
                {
                    //r[lnou][cnou]=r[l][c]+d[lnou][cnou]-f;
                    v[lnou][cnou]=nr;
                    q.push(make_pair(lnou,cnou));
                }
        }
    }
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            fin>>x[i][j];
            if(x[i][j]=='I')
            {
                a=i;
                b=j;
            }
            if(x[i][j]=='O')
            {
                fl=i;
                fc=j;
            }
            if(x[i][j]=='D')
            {
                q.push(make_pair(i,j));
                v[i][j]=1;
            }
        }
    bfs1();
    v[a][b]=2;
    q.push(make_pair(a,b));
    vef();
    if(v[fl][fc]!=2)
    {
        fout<<-1;
        return 0;
    }
    int st=0,dr=2*n*m;
    while(st<dr)
    {
        f=(st+dr+1)/2;
        nr++;
        v[a][b]=nr;
        if(d[a][b]>=f)
        {
            q.push(make_pair(a,b));
            bfs2();
        }
        //cout<<f<<' '<<r[fl][fc]<<'\n';
        if(v[fl][fc]!=nr)
            dr=f-1;
        else
            st=f;
    }
    fout<<st;
  /*  for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            cout<<d[i][j]<<' ';
        cout<<'\n';
    }*/
}