Cod sursa(job #2293017)

Utilizator mihailrazMihail Turcan mihailraz Data 30 noiembrie 2018 13:51:42
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <fstream>
#include <queue>
#define NMAX 1000

using namespace std;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
char C[NMAX+5][NMAX+5];
int n, m, lstart, cstart, lfinish, cfinish;
int dl[]={-1, 0, 1, 0}, dc[]={0, 1, 0, -1};
int dstDragon[NMAX+5][NMAX+5], DST[NMAX+5][NMAX+5], VIZ[NMAX+5][NMAX+5];
queue <pair <int, int> > Q;

void citire(void)
{
    fi>>n>>m;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            fi>>C[i][j];
            if(C[i][j]=='D')
            {
                Q.push({i, j});
                VIZ[i][j]=1;
            }
            if(C[i][j]=='I')
            {
                lstart=i;
                cstart=j;
            }
            if(C[i][j]=='O')
            {
                lfinish=i;
                cfinish=j;
            }
        }
}

bool accesibil(int lin, int col)
{
    if(VIZ[lin][col] || C[lin][col]=='*' || lin<1 || lin>n || col<1 || col>m)
        return 0;
    return 1;
}

void leeDragoni(void)
{
    int lin, col, lnou, cnou;
    while(!Q.empty())
    {
        lin=Q.front().first;
        col=Q.front().second;
        Q.pop();
        for(int d=0; d<4; d++)
        {
            lnou=lin+dl[d];
            cnou=col+dc[d];
            if(accesibil(lnou, cnou))
            {
                dstDragon[lnou][cnou]=dstDragon[lin][col]+1;
                VIZ[lnou][cnou]=1;
                Q.push({lnou, cnou});
            }
        }
    }
}

int lee(int distMax)
{
    int lin, col, lnou, cnou;
    while(!Q.empty())
        Q.pop();
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            VIZ[i][j]=DST[i][j]=0;

    Q.push({lstart, cstart});
    while(!Q.empty())
    {
        lin=Q.front().first;
        col=Q.front().second;
        Q.pop();
        for(int d=0; d<4; d++)
        {
            lnou=lin+dl[d];
            cnou=col+dc[d];
            if(accesibil(lnou, cnou) && dstDragon[lnou][cnou]>=distMax)
            {
                DST[lnou][cnou]=DST[lin][col]+1;
                VIZ[lnou][cnou]=1;
                Q.push({lnou, cnou});
            }
        }
    }
    return VIZ[lfinish][cfinish];
}

int cautBin(void)
{
    int lo=0, hi=n*m, mid, res=-1;
    while(lo<=hi)
    {
        mid=lo+(hi-lo)/2;
        if(lee(mid)==1)
        {
            res=mid;
            lo=mid+1;
        }
        else
            hi=mid-1;
    }
    return res;
}

int main()
{
    citire();
    leeDragoni();
    fo<<cautBin();
    fi.close();
    fo.close();
    return 0;
}