Cod sursa(job #2793075)

Utilizator Stefan_DomuncoStefan Domunco Stefan_Domunco Data 2 noiembrie 2021 20:10:44
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.71 kb
///lee din dragoni,apoi caut binar distanta minima maxima si verific cu lee
///O(n*m*log(n*m))
#include <bits/stdc++.h>

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int NMAX = 1e3+3;
int mat[NMAX][NMAX], aux[NMAX][NMAX], startlin, startcol, stoplin, stopcol;
///N E S V
int dirx[] = {-1, 0, 1, 0},
    diry[] = {0, 1, 0, -1};
int n, m, starti, startj;
queue <pair <int, int> >coada;

bool ok(int lin, int col)
{
    if(lin < 1 || lin > n)
        return false;

    if(col < 1 || col > n)
        return false;

    return true;
}

void lee()
{
    int lin, col, i;
    while(!coada.empty())
    {
        lin = coada.front().first;
        col = coada.front().second;
        coada.pop();
        for(i = 0; i < 4; i++)
            if(ok(lin + dirx[i], col + diry[i]) && mat[lin + dirx[i]][col + diry[i]] == 0)
            {
                mat[lin + dirx[i]][col + diry[i]] = mat[lin][col] + 1;
                coada.push({lin + dirx[i], col + diry[i]});
            }
    }
}

int lee_barbar(int lim)
{
    int lin, col, i, j;
    for(i = 1; i <= n; ++i)
        for(j = 1; j <= m; ++j)
        {
            if(aux[i][j] == -1)
                aux[i][j] = -1;
            else aux[i][j] = 0;
        }
    coada.push({startlin, startcol});
    aux[startlin][startcol] = 1;
    while(!coada.empty())
    {
        lin = coada.front().first;
        col = coada.front().second;
        coada.pop();
        for(i = 0; i < 4; ++i)
        if(ok(lin + dirx[i], col + diry[i]) && aux[lin + dirx[i]][col + diry[i]] == 0 && mat[lin + dirx[i]][col + diry[i]] >= lim)
            {
                aux[lin + dirx[i]][col + diry[i]] = mat[lin][col] + 1;
                coada.push({lin + dirx[i], col + diry[i]});
            }
    }

    return aux[stoplin][stopcol];
}

void sol()
{
    int st = 1, dr = 10000000, mij, rasp;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if(lee_barbar(mij))
            rasp = mij, st = mij + 1;
        else dr = mij - 1;
    }
    fout << rasp - 1;
}
int main()
{
    char ch;
    int i, j;

    fin >> n >> m;
    for(i = 1; i <= n; ++i)
        for(j = 1; j <= m; ++j)
        {
            fin >> ch;
            if(ch == 'D')
                aux[i][j] = 0, mat[i][j] = 1, coada.push({i, j});
            else if(ch == 'I')
                aux[i][j] = 1, mat[i][j] = 0, startlin = i, startcol = j;
            else if(ch == 'O')
                aux[i][j] = 0, mat[i][j] = 0, stoplin = i, stopcol = j;
            else if(ch == '*')
                aux[i][j] = -1, mat[i][j] = -1;
            else aux[i][j] = 0, mat[i][j] = 0;
        }

    lee();
    sol();

    return 0;
}