Cod sursa(job #3262582)

Utilizator _adeee18Adelina Maria _adeee18 Data 10 decembrie 2024 20:28:03
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <fstream>
#include <queue>
using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

int n, m, traseu[1005][1005], traseu2[1005][1005], istart, jstart, ifinal, jfinal, distmax;

char a[1005][1005];

queue < pair<int, int> > q;

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

void citire()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            fin >> a[i][j];
            if (a[i][j] == 'I')
            {
                istart = i;
                jstart = j;
            }
            else if (a[i][j] == 'O')
            {
                ifinal = i;
                jfinal = j;
            }
            else if (a[i][j] == 'D')
            {
                q.push(make_pair(i, j));
            }
        }
    }
}

void detTraseu()
{
    while (!q.empty())
    {
        int i = q.front().first, j = q.front().second;
        for (int k = 0; k < 4; k++)
        {
            int iv = i + di[k], jv = j + dj[k];
            if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && a[iv][jv] != '*' && traseu2[iv][jv] == 0)
            {
                traseu2[iv][jv] = traseu2[i][j] + 1;
                q.push(make_pair(iv, jv));
                distmax = max(distmax, traseu2[iv][jv]);
            }
        }
        q.pop();
    }
}

void initializare()
{
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            traseu[i][j] = 0;
}

int lee(int dif)
{
    while (!q.empty()) q.pop();
    initializare();
    q.push(make_pair(istart, jstart));
    while (!q.empty())
    {
        int i = q.front().first, j = q.front().second;
        for (int k = 0; k < 4; k++)
        {
            int iv = i + di[k], jv = j + dj[k];
            if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && traseu[iv][jv] == 0 &&
                    (a[iv][jv] == '.' || a[iv][jv] == 'O') && traseu2[iv][jv] >= dif)
            {
                traseu[iv][jv] = traseu[i][j] + 1;
                q.push(make_pair(iv, jv));
                if (iv == ifinal && jv == jfinal)
                    return 1;
            }
        }
        q.pop();
    }
    return 0;
}

void detDistMax()
{
    int st = 1, dr = distmax, rezultat = 0;
    while (st <= dr)
    {
        int mij = (st + dr) / 2;
        if (lee(mij) == 1)
        {
            rezultat = mij;
            st = mij + 1;
        }
        else
        {
            dr = mij - 1;
        }
    }
    fout << rezultat;
}

int main()
{
    citire();
    detTraseu();
    detDistMax();
    return 0;
}