Cod sursa(job #3229869)

Utilizator velciu_ilincavelciu ilinca velciu_ilinca Data 17 mai 2024 20:04:02
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.46 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");

const int nmax = 1001;
int nou[nmax][nmax];
struct dragonel
{
    int lin,col;
};
queue<dragonel>dragoni;
queue<dragonel>q;
int verif[nmax][nmax];
int di[] = {-1, 0, 1, 0};
int dj[] = {0, 1, 0, -1};
int n,m;
dragonel inceput;
dragonel destinatie;
bool bariera(dragonel p)
{
    int l = p.lin;
    int c = p.col;
    if(1 <= l && l <= n && 1 <= c && c <= m)
        return true;
    return false;
}
void lee()
{
    while(!dragoni.empty())
    {

        dragonel curent;
        curent.lin = dragoni.front().lin;
        curent.col = dragoni.front().col;
        dragoni.pop();
        for(int k = 0; k <= 3; k++)
        {
            dragonel vecin;
            vecin.lin = curent.lin + di[k];
            vecin.col = curent.col + dj[k];
            if(bariera(vecin) == true && nou[vecin.lin][vecin.col] == 0)
            {
                nou[vecin.lin][vecin.col] = nou[curent.lin][curent.col] + 1;
                dragoni.push(vecin);
            }
        }
    }
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            if(nou[i][j] == 0)
                nou[i][j] = 1e9;
            else
                nou[i][j]--;//pt ca am inceput distantele de la dragoni de la 1 in loc de 0
        }
}
bool exista_traseu(int dist)
{
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            if(nou[i][j] >= dist)///distanta cedl putin prag!!!
                verif[i][j] = 0;
            else
                verif[i][j] = -1;
    verif[inceput.lin][inceput.col] = 1;//!!!!! nu aduna nimic inainte
    q.push(inceput);
    while(!q.empty())
    {
        dragonel curent;
        curent.lin = q.front().lin;
        curent.col = q.front().col;
        q.pop();
        for(int k = 0; k <= 3; k++)
        {
            dragonel vecin;
            vecin.lin = curent.lin + di[k];
            vecin.col = curent.col + dj[k];
            if(bariera(vecin) == true && verif[vecin.lin][vecin.col] == 0)
            {
                verif[vecin.lin][vecin.col] = verif[curent.lin][curent.col] + 1;
                q.push(vecin);
            }
        }
    }
    if(verif[destinatie.lin][destinatie.col] > 0)
        return true;
    return false;
}
int cb(int st, int dr)
{
    int traseu = -1;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        if(exista_traseu(mij) == true)
        {
            traseu = mij;
            st = mij + 1;
        }
        else
            dr = mij - 1;
    }
    return traseu;
}
int main()
{
    in>>n>>m;

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            char x;
            in>>x;
            if(x == '.')
                nou[i][j] = 0;
            else if(x == '*')
                nou[i][j] = -1;
            else if(x == 'D')
            {
                nou[i][j] = 1; //-1 for all
                dragonel dragon;
                dragon.lin = i;
                dragon.col = j;
                dragoni.push(dragon);
            }
            else if(x == 'I')
            {
                inceput.lin = i;
                inceput.col = j;
            }
            else if(x == 'O')
            {
                destinatie.lin = i;
                destinatie.col = j;
            }
    }
    lee();
    out<<cb(1, n * m);
    return 0;
}