Cod sursa(job #2083039)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 6 decembrie 2017 23:48:54
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <bits/stdc++.h>
using namespace std;

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

#define x first
#define y second

const int NMAX = 1e3;

string str;

int n, m;
char a[NMAX + 2][NMAX + 2];
int dist[NMAX + 2][NMAX + 2];
bool vis[NMAX + 2][NMAX + 2];
queue<pair<int, int>> dragoni;
pair<int, int> start;

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

void bordare();
void calcDist();

bool check(int arg)
{
    if(dist[start.x][start.y] < arg)
        return false;

    memset(vis, 0, sizeof vis);
    queue<pair<int, int>> q;

    vis[start.x][start.y] = true;
    q.push(start);

    while(!q.empty())
    {
        pair<int, int> fr = q.front();

        for(int d = 0; d < 4; d++)
        {
            pair<int, int> tmp = {fr.x + dx[d], fr.y +dy[d]};

            if(!vis[tmp.x][tmp.y] && dist[tmp.x][tmp.y] >= arg && a[tmp.x][tmp.y] != '*')
            {
                if(a[tmp.x][tmp.y] == 'O')
                    return true;

                vis[tmp.x][tmp.y] = true;
                q.push(tmp);
            }
        }

        q.pop();
    }

    return false;

}

int main()
{
    in >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        in >> str;
        for(int j = 1; j <= m; j++)
        {
            a[i][j] = str[j - 1];
            if(a[i][j] == 'I')
                start.x = i,
                start.y = j;
            if(a[i][j] == 'D')
            {
                dragoni.push({i, j});
                vis[i][j] = true;
            }
        }
    }
    bordare();
    calcDist();

    int st = 1, dr = n * m, ans = -1;
    while(st <= dr)
    {
        int med = (st + dr) / 2;
        if(check(med))
        {
            st = med + 1;
            ans = med;
        }
        else dr = med - 1;
    }

    out << ans << '\n';

    return 0;
}

void bordare()
{
    for(int i = 0; i <= n + 1; i++)
        a[i][0] = a[i][m + 1] = '*';

    for(int j = 0; j <= m + 1; j++)
        a[0][j] = a[n + 1][j] = '*';
}

void calcDist()
{
    while(!dragoni.empty())
    {
        pair<int, int> fr = dragoni.front();

        for(int d = 0; d < 4; d++)
        {
            pair<int,int> tmp = {fr.x + dx[d], fr.y + dy[d]};
            if(!vis[tmp.x][tmp.y] && a[tmp.x][tmp.y] != '*')
            {
                vis[tmp.x][tmp.y] = true;
                dist[tmp.x][tmp.y] = dist[fr.x][fr.y] + 1;
                dragoni.push(tmp);
            }
        }

        dragoni.pop();
    }
}