Cod sursa(job #2137217)

Utilizator ContDeRacistAliniateEBlat ContDeRacist Data 20 februarie 2018 17:49:57
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <fstream>

using namespace std;

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

char a[1005][1005];
bool vizit[1005][1005];
int d[1005][1005], n, m;
int dl[4] = {-1, 0, 1, 0};
int dc[4] = {0, -1, 0, 1};
pair < int, int >  q[1000005], start, finish;

void _fill(pair < int, int > poz, int mindist)
{
    vizit[poz.first][poz.second] = true;
    for (int i = 0; i < 4; ++i)
    {
        int x = poz.first + dl[i], y = poz.second + dc[i];
        if (a[x][y] != '.' && a[x][y] != 'I' && a[x][y] != 'O')
            continue;
        if (d[x][y] < mindist || vizit[x][y] == true)
            continue;
        _fill(make_pair(x, y), mindist);
    }
}

void sterge()
{
    for (int i = 0; i <= n + 1; ++i)
    {
        for (int j = 0; j <= m + 1; ++j)
        {
            vizit[i][j] = false;
        }
    }
}

bool drum(int mindist)
{
    sterge();
    _fill(start, mindist);
    /*for (int i = 0; i <= n + 1; ++i)
    {
        for (int j = 0; j <= m + 1; ++j)
        {
            cout << vizit[i][j] << " ";
        }
        cout << "\n";
    }
    cout << "\n";*/
    return vizit[finish.first][finish.second];
}

int cb()
{
    int pas = 1<<19, r = 0;
    while (pas > 0)
    {
        if (d[start.first][start.second] >= r + pas && drum(r + pas))
        {
            r += pas;
        }
        pas>>=1;
    }
    return r - 1;
}

int main()
{
    int st(0), dr(-1);
    cin >> n >> m >> ws;
    for (int i = 1; i <= n; ++i)
    {
        cin.getline(1 + a[i], 180);
        for (int j = 1; j <= m; ++j)
        {
            if (a[i][j] == 'D')
            {
                q[++dr] = make_pair(i, j);
                d[i][j] = 1;
            }
            if (a[i][j] == 'I')
            {
                start = make_pair(i, j);
            }
            if (a[i][j] == 'O')
            {
                finish = make_pair(i, j);
            }
        }
    }
    while (st <= dr)
    {
        pair < int, int > x (q[st++]);
        for (int i = 0; i < 4; ++i)
        {
            pair < int, int > _x(make_pair(x.first + dl[i], x.second + dc[i]));
            if(a[_x.first][_x.second] != '.' && a[_x.first][_x.second] != 'I' && a[_x.first][_x.second] != 'O')
            {
                continue;
            }
            if (d[_x.first][_x.second] == 0)
            {
                d[_x.first][_x.second] = d[x.first][x.second] + 1;
                q[++dr] = _x;
            }
        }
    }
    /*for (int i = 0; i <= n + 1; ++i)
    {
        for (int j = 0; j <= m + 1; ++j)
        {
            cout << d[i][j] << " ";
        }
        cout << "\n";
    }*/
    /*for (int i = 1; i <= n; ++i)
    {
        cout << (1 + a[i]);
        cout << "\n";
    }*/
    cout << cb();
    return 0;
}