Cod sursa(job #2303592)

Utilizator alex.carpCarp Alexandru alex.carp Data 16 decembrie 2018 16:36:23
Problema Barbar Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 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];
int 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();
    }
}
int cbinara(int st,int dr)
{
    int mok=-1;
    while(st<=dr)
    {
        m=(st+dr)/2;
        ok=0;
        while(!coada.empty())coada.pop();
        coada.push(I);
        lee(m);
        if(ok==0)dr=m-1;
        else
        {
            mok=m;
            st=m+1;
        }
    }
    return mok;
}
int main()
{citire();
lee(-1);
g<<cbinara(1,min(d[I.first][I.second],d[O.first][O.second]));
    return 0;
}