Cod sursa(job #2502523)

Utilizator Andrei2313Avram Andrei Andrei2313 Data 30 noiembrie 2019 23:14:48
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,startx,starty,stopx,stopy,x,y;
int D[1005][1005],sol[1005][1005];
char a[1005][1005];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
int i,j,i_urmator,j_urmator,d;
queue <pair <int,int> > Q;
void Read()
{
    int i,j;
    char c;
    fin>>n>>m;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            fin>>c;
            a[i][j] = c;
            if(c=='D')
                Q.push(make_pair(i,j));
            else if(c=='I')
            {
                startx = i;
                starty = j;
            }
            else if(c=='O')
            {
                stopx = i;
                stopy = j;
            }
        }
}
bool OK(int i, int j)
{
    if(i>n || j>m || i<1 || j<1)
        return false;
    return true;
}
void LeeDragon()
{
    while(!Q.empty())
    {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();
        for(d=0; d<4; d++)
        {
            i_urmator= i+dx[d];
            j_urmator= j+dy[d];
            if(OK(i_urmator,j_urmator) and a[i_urmator][j_urmator]!='D')
            {
                if(D[i_urmator][j_urmator]==0)
                {
                    Q.push(make_pair(i_urmator,j_urmator));
                    D[i_urmator][j_urmator] = 1+D[i][j];
                }
            }
        }
    }
}
bool LeeBarbar(int x) /// toate celulele mai mici decat x sunt obstacole
{
    Q.push(make_pair(startx,starty));
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            sol[i][j] = 0;
    sol[startx][starty] = x;

    while(!Q.empty())
    {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();
        for(d=0; d<4; d++)
        {
            i_urmator = i+dx[d];
            j_urmator = j+dy[d];
            if(OK(i_urmator,j_urmator))
            {
                if(sol[i_urmator][j_urmator] != x && D[i_urmator][j_urmator] >= x)
                {
                    Q.push(make_pair(i_urmator,j_urmator));
                    sol[i_urmator][j_urmator] = x;
                }
            }
        }
    }
    return sol[stopx][stopy];
}
int main()
{
    Read();
    LeeDragon();
    LeeBarbar(x);
    long long st=1;
    long long dr=n;
    long long ret = 0;
    while (st<=dr)

    {
        long long mij=(st+dr)/2;
        bool ok = LeeBarbar(mij);
        if(ok)
        {
            ret = mij;
            st = mij + 1;
        }
        else
        {
            dr = mij - 1;
        }

    }
    fout << ret <<"\n";
    return 0;
}