Cod sursa(job #2895963)

Utilizator LelFunXDCirimpei Luca LelFunXD Data 29 aprilie 2022 18:03:42
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb

#include <fstream> 
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, k;
char c;
int mat[1001][1001];
bool a[1001][1001];
int dx[] = { 0, 0, -1, 1 };
int dy[] = { -1, 1, 0, 0 };
int istart, jstart, ifinal, jfinal;
int st, dr;
int max = -1;
int obs;
queue < pair < int, int > > coada;
bool border(int i, int j)
{
    return i >= 1 && i <= n && j >= 1 && j <= m;
}
void LeeD()
{
    while (!coada.empty())
    {
        int x = coada.front().first;
        int y = coada.front().second;
        coada.pop();
        for (int i = 0; i <= 3; i++)
        {
            int inou = x + dx[i];
            int jnou = y + dy[i];
            if (border(inou, jnou) && mat[inou][jnou] == 0)
            {
                mat[inou][jnou] = mat[x][y] + 1;
                coada.push(make_pair(inou, jnou));
            }
        }
    }
}
void fill(int is, int js)
{
    coada.push(make_pair(is, js));
    a[is][js] = 1;
    while (!coada.empty())
    {
        int x = coada.front().first;
        int y = coada.front().second;
        coada.pop();
        for (int i = 0; i <= 3; i++)
        {
            int inou = x + dx[i];
            int jnou = y + dy[i];
            if (border(inou, jnou) && a[inou][jnou] == 0 && mat[inou][jnou] >= obs)
            {
                a[inou][jnou] = 1;
                coada.push(make_pair(inou, jnou));
            }
        }
    }
}
int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            fin >> c;
            if (c == '*')
                mat[i][j] = -1;
            else if (c == 'D')
            {
                mat[i][j] = 1;
                coada.push(make_pair(i, j));
            }
            else if (c == 'I')
            {
                istart = i;
                jstart = j;
            }
            else if (c == 'O')
            {
                ifinal = i;
                jfinal = j;
            }

        }
    LeeD(); 
    int rez = -1;
 
     for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            mat[i][j] = mat[i][j] - 1;
            if (mat[i][j] > dr)
                dr = mat[i][j];
        } 
    while (st <= dr)
    {
        obs = (st + dr) / 2; 
        if(mat[istart][jstart] >= obs)
          fill(istart, jstart);
        if (a[ifinal][jfinal] == 1)
        {
            rez = obs;
            st = obs + 1;
        }
        else
            dr = obs - 1;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                a[i][j] = 0;
    }
    fout << rez;
}