Cod sursa(job #2602920)

Utilizator mihaicosmin2011Mihai Cosmin mihaicosmin2011 Data 18 aprilie 2020 09:33:09
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <bits/stdc++.h>
using namespace std;

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

const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
int a[1005][1005], b[1005][1005], d[1005][1005], xi, yi, xf, yf, st, dr, mij, rez = -1, n, m;
queue < pair < int, int > > Q;
char c;

void Fill(int i, int j, int dist)
{
    a[i][j] = -1;
    for(int k = 0; k < 4; ++ k)
    {
        int ii = i + dx[k];
        int jj = j + dy[k];
        if(a[ii][jj] == 0 && d[ii][jj] - 1 >= dist)
        {
            Fill(ii, jj, dist);
        }
    }
}
int main()
{
    f >> n >> m;
    // bordare
    for(int i = 0; i <= n + 1; ++ i)
    {
        a[i][0] = a[i][m + 1] = b[i][0] = b[i][m + 1] = d[i][0] = d[i][m + 1] = -1;
    }

    for(int i = 0; i <= m + 1; ++ i)
    {
        a[0][i] = a[n + 1][i] = b[0][i] = b[n + 1][i] = d[0][i] = d[n + 1][i] = -1;
    }

    for(int i = 1; i <= n; ++ i)
    {
        for(int j = 1; j <= m; ++ j)
        {
            f >> c;
            if(c == 'I')
            {
                xi = i;
                yi = j;
            }
            else if(c == 'O')
            {
                xf = i;
                yf = j;
            }
            else if(c == '*')
            {
                a[i][j] = b[i][j] = d[i][j] = -1;
            }
            else if(c == 'D')
            {
                Q.push({i, j});
                d[i][j] = 1;
            }
        }
    }

    while(!Q.empty())
    {
        int i = Q.front().first;
        int j = Q.front().second;
        for(int k = 0; k < 4; ++ k)
        {
            int ii = i + dx[k];
            int jj = j + dy[k];
            if(!d[ii][jj])
            {
                d[ii][jj] = d[i][j] + 1;
                Q.push({ii, jj});
            }
        }
        Q.pop();
    }

    st = 0;
    dr = n + m;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        memcpy(a, b, sizeof(b));
        Fill(xi, yi, mij);
        if(a[xf][yf] == 0 || d[xi][yi] <= mij)
            dr = mij - 1;
        else
        {
            rez = mij;
            st = mij + 1;
        }
    }
    g << rez << "\n";
    return 0;
}