Cod sursa(job #2033577)

Utilizator crion1999Anitei cristi crion1999 Data 7 octombrie 2017 00:18:40
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <iostream>
#include <fstream>
#include <queue>

#define NMAX 1005
#define INF 0x3f3f3f3f

using namespace std;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
void input();
void output();

int diri[] = {-1, 0, 1,  0};
int dirj[] = { 0, 1, 0, -1};

int dragon[NMAX][NMAX];
bool parcur[NMAX][NMAX];
int xStart, yStart, xFinish, yFinish;
int N, M;
queue<pair<int,int> > q;

bool check(int i,int j)
{
    return (i>=1 && i<=N && j>=1 && j<=M && dragon[i][j] != -1);
}

void setDragonParameters()
{
    while(!q.empty())
    {
        int i = q.front().first;
        int j = q.front().second;
        q.pop();
        for(int k=0; k<4; ++k)
        {
            int ii = i + diri[k];
            int jj = j + dirj[k];
            if(check(ii,jj))
            {
                if(dragon[ii][jj]> dragon[i][j]+1)
                {
                    dragon[ii][jj] = dragon[i][j]+1;
                    q.push({ii,jj});
                }
            }

        }
    }
}

bool lee(int cost)
{
    while(!q.empty()) q.pop();
    for(int i=1; i<=N; ++i)
    {
        for(int j=1; j<=M; ++j)
        {
            parcur[i][j]=0;
        }
    }
    if(cost<= dragon[xStart][yStart])
        q.push({xStart,yStart});

    while(!q.empty())
    {
        int i = q.front().first;
        int j = q.front().second;
        q.pop();
        for(int k=0; k<4; ++k)
        {
            int ii = i + diri[k];
            int jj = j + dirj[k];
            if(cost<= dragon[ii][jj] && check(ii,jj) && !parcur[ii][jj] && dragon[ii][jj]!=0)
            {
                q.push({ii,jj});
                parcur[ii][jj]=1;
                if(ii == xFinish && jj == yFinish)
                {
                    return 1;
                }
            }
        }
    }
    return 0;
}

int main()
{
    input();
    setDragonParameters();
    int dr = 1000, st = 0, mid;
    while(dr-st >1)
    {
        mid = (dr+st)/2;
        int s = lee(mid);
        if(s) st = mid;
        else dr = mid;
    }
    fo<<mid;

}

void input()
{
    fi>>N>>M;
    char c;

    for(int i=1; i<=N; ++i)
    {
        for(int j=1; j<=M; ++j)
        {
            dragon[i][j] = INF;
        }
    }

    for(int i=1; i<=N; ++i)
    {
        for(int j=1; j<=M; ++j)
        {
            fi>>c;
            if(c == 'I')
            {
                xStart = i;
                yStart = j;
            }
            else if(c == 'D')
            {
                q.push({i,j});
                dragon[i][j] = 0;
            }
            else if(c == '*')
            {
                dragon[i][j] = -1;
            }
            else if( c == 'O')
            {
                xFinish = i;
                yFinish = j;
            }
        }
    }
}