Cod sursa(job #3311369)

Utilizator alexiabortunBortun Alexia alexiabortun Data 21 septembrie 2025 16:59:32
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <fstream>

using namespace std;

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

#define N 1005
int r, c, a[N][N], m, d[N][N];
struct pozitie
{
    int lin, col;
}Q[N *N];
int prim, ultim;
int dl[] = {-1, 1, 0, 0};
int dc[] = {0, 0 , -1, 1};
int ls, cs, lf, cf;
struct dragon
{
    int l, c;
}D[N];
int distmax = -1;
void citire()
{
    fin >> r >> c;
    char s;
    prim = 1;
    ultim = 0;
    for(int i = 1; i <= r; i++)
        for(int j = 1; j <= c; j++)
    {
        fin >> s;
        if(s == 'I')
        {
            ls = i;
            cs = j;
            a[i][j] = 1;
            d[i][j] = 0;
        }
        else if(s == 'O')
        {
            lf = i;
            cf = j;
            a[i][j] = d[i][j] =  0;
        }
        else if(s == 'D')
            {
                a[i][j] = 0;
                d[i][j] = 1;
                ultim++;
                Q[ultim].lin = i;
                Q[ultim].col = j;
            }
        else if(s == '*')
            a[i][j] = d[i][j] = -1;
    }
}

bool inside(int lin, int col)
{
    return lin >= 1 && lin <= r && col >= 1 && col <= c;
}
void lee()
{
    while(prim <= ultim )
    {
        int l = Q[prim].lin, c = Q[prim].col;
        prim++;
        for(int k = 0; k < 4; k++)
        {
            int lv = l + dl[k];
            int cv = c + dc[k];
            if(inside(lv, cv) && d[lv][cv] == 0)
            {
                ultim++;
                Q[ultim].lin = lv;
                Q[ultim].col = cv;
                d[lv][cv] = d[l][c] + 1;

            }
        }
    }
}
bool viz[N][N];
bool drum(int dmin)
{
    if(d[ls][cs] < dmin)
        return 0;
    Q[1].lin = ls;
    Q[1].col = cs;
    prim = ultim = 1;
    for(int i = 1; i <= r; i++)
        for(int j = 1; j <= c; j++)
            viz[i][j] = 0;
    viz[ls][cs] = 1;
    while(prim <= ultim)
    {
        int l = Q[prim].lin, c= Q[prim].col;
        prim++;
        if(l == lf && c == cf)
            return 1;
        for(int k = 0; k < 4; k++)
        {
            int lv = l + dl[k];
            int cv = c + dc[k];
            if(inside(lv, cv) && a[lv][cv] != -1 && !viz[lv][cv] && d[lv][cv] >= dmin)
            {
                viz[lv][cv] = 1;
                ultim++;
                Q[ultim].lin = lv;
                Q[ultim].col = cv;
            }
        }
    }
    return 0;
}

void cb()
{
    int st = 0, dr = r + c, mij, sol = -1;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if(drum(mij))
        {
            sol = mij;
            st = mij + 1;
        }
        else
            dr = mij - 1;
    }
    fout << sol;
}
int main()
{
    citire();
    lee();
    for(int i = 1; i <= r; i ++)
        for(int j = 1; j <= c; j++)
            d[i][j]--;
    cb();
    return 0;
}