Cod sursa(job #2823414)

Utilizator bananamandaoneTudor Cosmin Oanea bananamandaone Data 28 decembrie 2021 14:06:33
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, istart, jstart, istop, jstop;
vector< vector<char> > a;
vector< vector<int> > viz;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};

void citire()
{
    fin >> n >> m;
    a.resize(n);
    for(int i = 0; i < n; i++)
        a[i].resize(m);

    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
        {
            fin >> a[i][j];
            if(a[i][j] == 'I')
            {
                istart = i;
                jstart = j;
            }
            else if(a[i][j] == 'O')
            {
                istop = i;
                jstop = j;
            }
        }
}

void viz_init()
{
    viz.clear();
    viz.resize(n);
    for(int i = 0; i < n; i++)
        viz[i].resize(m);
}

bool inmatr(int i, int j)
{
    return (i >= 0) && (j >= 0) && (i < n) && (j < m);
}

void ffill(int i, int j, int k)
{
    bool ok = true;
    for(int dir = 0; dir < 4; dir++)
        for(int d = 1; d < k && ok; d++)
            if(inmatr(i + (d * dx[dir]), j + (d * dy[dir])))
                if(a[i + (d * dx[dir])][j + (d * dy[dir])] == 'D')
                    return;

    viz[i][j] = 1;

    for(int dir = 0; dir < 4; dir++)
    {
        int ii = i + dx[dir];
        int jj = j + dy[dir];

        if(inmatr(ii, jj) && viz[ii][jj] == 0 && (a[ii][jj] == '.' || a[ii][jj] == 'O') && ok)
            ffill(ii, jj, k);
    }
}

int caut_bin()
{
    int st = 1, dr = 1000, mij, sol = -1;

    while(st <= dr)
    {
        mij = st + (dr - st) / 2;

        viz_init();
        ffill(istart, jstart, mij);

        if(viz[istop][jstop] == 1)
        {
            sol = mij;
            st = mij + 1;
        }
        else dr = mij - 1;
    }

    return sol;
}

int main()
{
    citire();
    fout << caut_bin() << "\n";

    fin.close();
    fout.close();
    return 0;
}