Cod sursa(job #2504567)

Utilizator dnprxDan Pracsiu dnprx Data 5 decembrie 2019 10:38:47
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <bits/stdc++.h>

using namespace std;

queue < pair<int, int> > q;
char a[1005][1005];
int L, C, b[1005][1005], xs, ys, xf, yf;
int c[1005][1005];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};

void Citire()
{
    int i;
    ifstream fin("barbar.in");
    fin >> L >> C;
    for (i = 1; i <= L; ++i)
        fin >> (a[i] + 1);
    fin.close();
    for (i = 1; i <= L; ++i)
        for (int j = 1; j <= C; ++j)
            if (a[i][j] == 'I') {xs = i; ys = j;a[i][j] = '.';}
            else if (a[i][j] == 'O') {xf = i; yf = j;a[i][j] = '.';}
}

void Bordare()
{
    int i;
    for (i = 0; i <= C + 1; ++i)
        a[0][i] = a[L + 1][i] = '*';
    for (i = 0; i <= L + 1; ++i)
        a[i][0] = a[i][C + 1] = '*';
}

void Init()
{
    int i, j;
    for (i = 1; i <= L; ++i)
        for (j = 1; j <= C; ++j)
            b[i][j] = 2000000;
}

void Lee()
{
    int i, j, x, y, k;
    for (i = 1; i <= L; ++i)
        for (j = 1; j <= C; ++j)
            if (a[i][j] == 'D')
            {
                b[i][j] = 0;
                q.push(make_pair(i, j));
            }
    while (!q.empty())
    {
        x = q.front().first;
        y = q.front().second;
        q.pop();
        for (k = 0; k < 4; ++k)
        {
            i = x + dx[k];
            j = y + dy[k];
            if (a[i][j] != '*' && b[i][j] > b[x][y] + 1)
            {
                b[i][j] = b[x][y] + 1;
                q.push(make_pair(i, j));
            }
        }
    }
}

void InitC()
{
    int i, j;
    for (i = 1; i <= L; ++i)
        for (j = 1; j <= C; ++j)
            c[i][j] = 0;
}

void Fill(int i, int j, int D)
{
    if (a[i][j] == '.' && c[i][j] == 0 && b[i][j] >= D)
    {
        c[i][j] = 1;
        Fill(i + 1, j, D);
        Fill(i - 1, j, D);
        Fill(i, j + 1, D);
        Fill(i, j - 1, D);
    }
}

int CautBin()
{
    int st, dr, m, sol;
    st = 1; dr = min(L, C);
    sol = -1;
    while(st <= dr)
    {
        m = (st + dr) / 2;
        InitC();
        Fill(xs, ys, m);
        if (c[xf][yf] == 1)
        {
            sol = m;
            st = m + 1;
        }
        else dr = m - 1;
    }
    return sol;
}

void Afisare()
{
    int solutie;
    solutie = CautBin();
    ofstream fout("barbar.out");
    fout << solutie << "\n";
    fout.close();
}

int main()
{
    Citire();
    Bordare();
    Init();
    Lee();
    Afisare();
    return 0;
}