Cod sursa(job #2235869)

Utilizator AndreiJJIordan Andrei AndreiJJ Data 27 august 2018 11:23:45
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <bits/stdc++.h>
#define oo 2000000
using namespace std;
char a[1002][1002], b[1002][1002];
stack < pair <int, int> > st;
queue < pair <int, int> > q;
int d[1002][1002];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int n, m, xs, ys, xf, yf;
void Read ()
{
    int i, j;
    ifstream fin ("barbar.in");
    fin >> n >> m;
    for (i = 1; i <= n; i++)
        fin >> (a[i] + 1);
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
            if (a[i][j] == 'I')
            {
                    xs = i; ys = j;
            }
            else if (a[i][j] == 'O')
            {
                    xf = i; yf = j;
            }
    fin.close();
}
void Board ()
{
    int i;
    for (i = 0; i <= n + 1; i++)
        a[i][0] = a[i][m+1] = '*';
    for (i = 0; i <= m + 1; i++)
        a[0][i] = a[n+1][i] = '*';
}
/// merg de la poz xs, ys doar pe distante >= dist
void Fill (int dist)
{
    int k, x, y, i, j;
    /// initiez matricea b cu 0
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
            b[i][j] = '0';
    st.push({xs, ys});
    b[xs][ys] = '1';
    while (!st.empty())
    {
        i = st.top().first;
        j = st.top().second;
        st.pop();
        for (k = 0; k <= 3; k++)
        {
            x = i + dx[k];
            y = j + dy[k];
            if (b[x][y] == '0' && d[x][y] >= dist && a[x][y] != '*')
            {
                st.push({x, y});
                b[x][y] = '1';
            }
        }
    }
}
void BinSearch ()
{
    int st, dr, mij, sol;
    st = 1;
    dr = min (d[xs][ys], d[xf][yf]);
    sol = 1;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        Fill (mij);
        if (b[xf][yf] == '1')
        {
            sol = mij;
            st = mij + 1;
        }
        else dr = mij - 1;
    }
    ofstream fout ("barbar.out");
    fout << sol << "\n";
    fout.close();
}
void Initiate ()
{
    int i, j;
    for (i = 0; i <= n + 1; i++)
        for ( j = 0; j <= m + 1; j++)
            d[i][j] = oo;
}
void Lee ()
{
    int i, j, x, y, k;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
            if (a[i][j] == 'D')
                {
                    q.push({i, j});
                    d[i][j] = 0;
                }
    while (!q.empty())
    {
        i = q.front().first;
        j = q.front().second;
        q.pop();
        for (k = 0; k <= 3; k++)
        {
            x = i + dx[k];
            y = j + dy[k];
            if (a[x][y] != '*' && d[x][y] > d[i][j] + 1)
            {
                d[x][y] = d[i][j] + 1;
                q.push ({x, y});
            }
        }
    }
}

int main()
{
    Read ();
    Board();
    Initiate();
    Lee();
    BinSearch();
    return 0;
}