Cod sursa(job #2303609)

Utilizator alex.carpCarp Alexandru alex.carp Data 16 decembrie 2018 17:12:36
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
pair<int,int>w[5],O,I;
queue<pair<int,int> >coada;
char a[1005][1005];
long d[1005][1005];
bool viz[1005][1005],ok;
int n,m;
void citire()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            f>>a[i][j];
            d[i][j]=-1;
            if(a[i][j]=='D')
            {
                coada.push(make_pair(i,j));
                d[i][j]=0;
            }
            if(a[i][j]=='*')
                d[i][j]=-2;
            if(a[i][j]=='I')
                I=make_pair(i,j);
            if(a[i][j]=='O')
                O=make_pair(i,j);
        }

}
void lee(int x)
{
    w[1]=make_pair(1,0);
    w[2]=make_pair(-1,0);
    w[3]=make_pair(0,1);
    w[4]=make_pair(0,-1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        viz[i][j]=0;
    while(!coada.empty())
    {
        int linie=coada.front().first;
        int coloana=coada.front().second;
        for(int i=1;i<=4;i++)
        {
            if(x==-1 && d[linie+w[i].first][coloana+w[i].second]==-1)
            {
                d[linie+w[i].first][coloana+w[i].second]=d[linie][coloana]+1;
                coada.push(make_pair(linie+w[i].first,coloana+w[i].second));
            }
            if(x!=-1 && d[linie+w[i].first][coloana+w[i].second]>=x && viz[linie+w[i].first][coloana+w[i].second]==0)
            {
                if(linie+w[i].first==O.first && coloana+w[i].second==O.second){ok=1;return;}
                viz[linie+w[i].first][coloana+w[i].second]=1;
                coada.push(make_pair(linie+w[i].first,coloana+w[i].second));
            }
        }
        coada.pop();
    }
}
long cbinara(long st,long dr)
{
    long tok=-1;
    long t;
    while(st<=dr)
    {
        t=(st+dr)/2;
        ok=0;
        while(!coada.empty())coada.pop();
        coada.push(I);
        lee(t);
        if(ok==0)dr=t-1;
        else
        {
            tok=t;
            st=t+1;
        }
    }
    return tok;
}
int main()
{citire();
lee(-1);
g<<cbinara(0,min(d[I.first][I.second],d[O.first][O.second]));
    return 0;
}