Cod sursa(job #2823999)

Utilizator amalia.gemanGeman Aamalia amalia.geman Data 30 decembrie 2021 15:40:19
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.24 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, pr, ul, xs, ys, xf, yf;
int a[1002][1002], b[1002][1002], cx[1000001], cy[1000001];
bool viz[1001][1001];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};




void Read()
{
    fin >> n >> m;
    fin.get();

    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            char c;
            fin >> c;

            if(c == '.')
                a[i][j] = 0;
            else if(c == '*')
                a[i][j] = -1;
            else if(c == 'D')
            {
                a[i][j] = -2;
                ul++;
                cx[ul] = i;
                cy[ul] = j;
            }
            else if(c == 'I')
            {
                a[i][j] = -3;
                xs = i; // a[xs,ys] - start
                ys = j;
            }
            else if(c == 'O')
            {
                a[i][j] = -4;
                xf = i; // a[xf,yf] - final
                yf = j;
            }
        }
        fin.get();
    }
}

void LEE()
{
    pr = 1;

    while(pr <= ul)
    {
        int xc = cx[pr];
        int yc = cy[pr];

        for(int i = 0; i <= 3; ++i)
        {
            int xv = xc + dx[i];
            int yv = yc + dy[i];
            if(xv >= 1 && xv <= n && yv >= 1 && yv <= m)
                if(a[xv][yv] == 0)
                {
                    if(a[xc][yc] == -2)
                    {
                        a[xv][yv] = 1;
                        ul++;
                        cx[ul] = xv;
                        cy[ul] = yv;
                    }
                    else
                    {
                        a[xv][yv] = a[xc][yc] + 1;
                        ul++;
                        cx[ul] = xv;
                        cy[ul] = yv;
                    }
                }
        }
        pr++;
    }
}

int le(int val)
{
    pr = ul =1;

    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            viz[i][j] = 0;

    cx[pr] = xs;
    cy[pr] = ys;
    viz[xs][ys] = 1;

    while(pr <= ul)
    {
        int xc = cx[pr];
        int yc = cy[pr];

        for(int i = 0; i <= 3; ++i)
        {
            int xv = xc + dx[i];
            int yv = yc + dy[i];

            if(xv >= 1 && xv <= n && yv >=1 && yv <= m)
                if((a[xv][yv] >= val || a[xv][yv] == -4) && (a[xv][yv] > 0 || a[xv][yv] == -4) && viz[xv][yv] == 0)
                {
                    if(a[xv][yv] == -4)
                        return 1;
                    else
                    {
                        viz[xv][yv] = 1;
                        ul++;
                        cx[ul] = xv;
                        cy[ul] = yv;
                    }
                }
        }
        pr++;
    }
    return 0;
}

void Solve()
{
    int s = 1;
    int d = n + m;

    while(s <= d)
    {
        int mij = s + (d-s)/2;
        if(le(mij) == 1)
            s = mij + 1;
        else
            d = mij - 1;
    }

    if((s-1) > 0)
        fout << s-1;
    else
        fout << -1;
}

int main()
{
    Read();
    LEE();
    Solve();

    return 0;
}