Cod sursa(job #2412523)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 22 aprilie 2019 12:36:14
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <fstream>
#include <queue>
#define Nmax 1005

using namespace std;

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

int n, m;
pair <int, int> b, e;
queue < pair <int, int> > Q;
int mp[Nmax][Nmax];
bool a[Nmax][Nmax];

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

void lee()
{
    while(!Q.empty())
    {
        int x=Q.front().first;
        int y=Q.front().second;
        Q.pop();
        for (int i = 0; i <= 3; i++)
        {
            int xx = x + dx[i];
            int yy = y + dy[i];
            if(mp[xx][yy] == 0)
            {
                mp[xx][yy] = mp[x][y] + 1;
                Q.push({xx, yy});
            }
        }
    }
}

void erase()
{
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            a[i][j] = true;
}

bool ok(int i, int j, int val)
{
    if(mp[i][j] > val && a[i][j])
    {
        a[i][j] = false;
        return ((i == e.first && j == e.second) ||
                ok(i, j-1, val) || ok(i, j+1, val) ||
                ok(i-1, j, val) || ok(i+1, j, val));
    }
    return false;
}

int solve()
{
    int lft = 1, rgt = 1005*2, md, ans=-1;
    while(lft <= rgt)
    {
        erase();
        md = (lft + rgt) / 2;
        if(ok(b.first, b.second, md))
        {
            lft = md + 1;
            ans=md;
        }
        else
            rgt = md - 1;
    }
    return ans;
}

int main()
{
    char c;
    f >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        f.get();
        for (int j = 1; j <= m; j++)
        {
            f.get(c);
            if(c == 'I')
                b={i, j};
            else if(c == 'O')
                e={i, j};
            else if(c == 'D')
            {
                mp[i][j] = 1;
                Q.push(make_pair(i, j));
            }
            else if(c == '*')
                mp[i][j] = -1;
        }
    }

    for (int i = 0; i <= n+1; i++)
        mp[i][0] = mp[i][m+1] = -1;

    for (int i = 0; i <= m+1; i++)
        mp[0][i] = mp[n+1][i] = -1;
    lee();
    g << solve();

}