Cod sursa(job #2552363)

Utilizator Mada2003Madalina Scarlat Mada2003 Data 20 februarie 2020 19:44:38
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <fstream>
#include <queue>

using namespace std;

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

int di[4] = {0, 1, 0, -1};
int dj[4] = {1, 0, -1, 0};

int map[1005][1005];
int xi, yi, xf, yf, st, dr, mij, ans;
int a[1005][1005], b[1005][1005], r, c;

char ch;

pair<int, int> q[50000];

queue < pair<int, int> > coada;

void reset()
{
    for(int i = 1; i <= r; i++)
        for(int j = 1; j <= c; j++)
            a[i][j] = b[i][j];
}

void bordare()
{
    for(int i = 0; i <= r + 1; i++)
        map[i][0] = map[i][r + 1] = a[i][0] = a[i][r + 1] = b[i][0] = b[i][r + 1] = -2;
    for(int i = 0; i <= c + 1; i++)
        map[0][i] = map[c + 1][i] =  a[0][i] = a[c + 1][i] =  b[0][i] = b[c + 1][i] = -2;
}

void lee()
{
    int i, j, iurm, jurm;
    while(!coada.empty())
    {
        i = coada.front().first;
        j = coada.front().second;
        coada.pop();
        for(int directie = 0; directie < 4; directie++)
        {
            iurm = i + di[directie];
            jurm = j + dj[directie];
            if(!map[iurm][jurm])
            {
                map[iurm][jurm] = map[i][j] + 1;
                coada.push(make_pair(iurm, jurm));
            }
        }
    }
}

void fill(int x, int y, int d)
{
    int iurm, jurm;
    a[x][y] = -1;
    for(int directie = 0; directie < 4; directie++)
    {
        iurm = x + di[directie];
        jurm = y + dj[directie];
        if(!a[iurm][jurm] && map[iurm][jurm] - 1 >= d)
            fill(iurm, jurm, d);
    }
}

int main()
{
    cin >> r >> c;
    for(int i = 1; i <= r; i++)
        for(int j = 1; j <= c; j++)
        {
            cin >> ch;
            if(ch == 'D')
            {
                coada.push(make_pair(i, j));
                map[i][j] = 1;
            }
            else if(ch == '*')
                map[i][j] = a[i][j] = b[i][j] = -1;
            else if(ch == 'I')
            {
                xi = i;
                yi = j;
            }
            else if(ch == 'O')
            {
                xf = i;
                yf = j;
            }
        }

    bordare();
    lee();

    for(int i = 1; i <= r; i++)
        for(int j = 1; j <= c; j++)
            if(map[i][j] > 0)
                map[i][j] - 1;

    st = 0;
    dr = r + c;
    ans = 0;
    int ok = 0;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        reset();
        fill(xi, yi, mij);
        if(a[xf][yf] == 0 || map[xi][yi] <= mij)
            dr = mij - 1;
        else
        {
            ok = 1;
            ans = mij;
            st = mij + 1;
        }
    }
    if(ok)
        cout << ans << "\n";
    else cout << -1 << "\n";
    return 0;
}