Cod sursa(job #2508367)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 11 decembrie 2019 23:01:58
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <fstream>
#include <queue>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

int n,m,i,j;
char c;
int dist[1001][1001], dmax;
int a[1001][1001];
int viz[1001][1001];
int li,ci, lo,co;
int x,y, xx,yy;

int dx[4]={1, -1, 0,  0};
int dy[4]={0,  0, 1, -1};

queue < pair <int, int> > dragoni;
queue < pair <int, int> > drum;

bool inauntru(int x, int y)
{
    return (x>=1 && x<=n && y>=1 && y<=n);
}

bool drum_posibil(int L, int nr)
{
    int x,y,i;
    a[li][ci]=1;
    viz[li][ci]=nr;
    drum.push(make_pair(li,ci));
    while (!drum.empty())
    {
        x=drum.front().first;
        y=drum.front().second;
        drum.pop();
        for (i=0;i<4;i++)
        {
            xx=x+dx[i];
            yy=y+dy[i];
            if (viz[xx][yy]!=nr && dist[xx][yy]>=L)
            {
                a[xx][yy]=a[x][y]+1;
                viz[xx][yy]=nr;
                drum.push(make_pair(xx, yy));
            }
        }
    }
    return (viz[lo][co]==nr);
}

int main()
{
    f>>n>>m;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
        {
            f>>c;
            if (c=='I')
            {
                li=i;
                ci=j;
            }
            else if (c=='O')
            {
                lo=i;
                co=j;
            }
            else if (c=='*')
            {
                a[i][j]=-1;
            }
            else if (c=='D')
            {
                dragoni.push(make_pair(i,j));
                a[i][j]=-1;
            }
        }

    while (!dragoni.empty())
    {
        x=dragoni.front().first;
        y=dragoni.front().second;
        dragoni.pop();
        for (i=0;i<4;i++)
        {
            xx=x+dx[i];
            yy=y+dy[i];
            if (dist[xx][yy]==0 && a[xx][yy]==0 && inauntru(xx, yy))
            {
                dist[xx][yy]=dist[x][y]+1;
                dmax=max(dmax, dist[xx][yy]);
                dragoni.push(make_pair(xx, yy));
            }
        }
    }

    int st=1, dr=dmax, mij, rez=-1, nr=0;
    while (st<=dr)
    {
        nr++;
        mij=(st+dr)/2;
        if (drum_posibil(mij, nr))
        {
            rez=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }

    g<<rez;

    return 0;
}