Cod sursa(job #2444918)

Utilizator pishcotMiruna Turbatu pishcot Data 1 august 2019 19:01:04
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.72 kb
#include <bits/stdc++.h>
const int bomba = 2000000000;
using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

int n , m;
char a[1005][1005];
int b[1005][1005] , c[1005][1005];
int dx[] = {-1 , 0 , 0 , 1};
int dy[] = {0 , -1, 1 , 0};
int xi ,yi , xf, yf;
queue<pair<int , int> > q;

void Read()
{
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> (a[i] + 1);
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            if(a[i][j] == 'I')
            {
               xi = i;
               yi = j;
            }
            else if(a[i][j] == 'O')
            {
                xf = i;
                yf = j;
            }

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            b[i][j] = bomba;
}

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

void Init()
{
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            c[i][j] = bomba;
}


void Lee_dragoni()
{
    int i , j , x , y ,k;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            if(a[i][j] == 'D')
            {
               b[i][j] = 1;
               q.push({i,j});
            }

    while(!q.empty())
    {
        i = q.front().first;
        j = q.front().second;
        q.pop();
        for(k = 0; k <= 3; k++)
        {
            x = dx[k] + i;
            y = dy[k] + j;
            if(Check(x,y) &&  a[x][y] != '*' && b[x][y] > b[i][j] + 1)
            {
                b[x][y] = b[i][j] + 1;
                q.push({x,y});
            }
        }
    }
}

bool Lee_paftene(int dist)
{
    Init();
    int i , j , x , y , k;
    c[xi][yi] = 0;
    q.push({xi , yi});
    while(!q.empty())
    {
        i = q.front().first;
        j = q.front().second;
        q.pop();
        for(k = 0; k <= 3; k++)
        {
            x = dx[k] + i;
            y = dy[k] + j;
            if(Check(x,y) && a[x][y] != '*' && b[x][y] > dist &&
               c[x][y] > c[i][j] + 1)
            {
               c[x][y] = c[i][j] + 1;
               q.push({x , y});
            }
        }
    }

    return !(c[xf][yf]==bomba);
}


void Caut_bin()
{
    int st=1,dr=5005,mij,sol=-1;

    while(st<=dr)
    {
        mij=(st+dr)/2;

        if(Lee_paftene(mij))
        {
            sol=mij;
            st=mij+1;
        }
        else dr=mij-1;
    }

    fout<<sol<<"\n";
}

int main()
{
    Read();
    Lee_dragoni();
    Caut_bin();
    /**
    for(int i = 1; i <= n;i++,cout<<"\n")
        for(int j = 1; j <= m; j++)
            cout<<(b[i][j]==bomba ? 0:b[i][j])<<" ";

    */
    return 0;

}