Cod sursa(job #2914664)

Utilizator velciu_ilincavelciu ilinca velciu_ilinca Data 20 iulie 2022 16:42:12
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <fstream>
#include <iostream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
char c[1001][1001];
int n,m;
struct lincol
{
    int lin,col;
};
int nou[1001][1001],verif[1001][1001];

queue<lincol>dragon;
queue<lincol>q;
lincol inceput,destinatia;///I,O

int di[]={-1,0,1,0};
int dj[]={0,1,0,-1};
bool bariera(lincol x)
{
    if(x.lin>=0 && x.col>=0 && x.lin<n && x.col<m)
        return true;
    return false;
}
void lee()
{
    while(!dragon.empty())
    {
        lincol curent=dragon.front();
        dragon.pop();
        for(int k=0;k<=3;k++)
        {
            lincol vecin;
            vecin.lin=curent.lin+di[k];
            vecin.col=curent.col+dj[k];
            if(bariera(vecin) && nou[vecin.lin][vecin.col]==0)
            {
                dragon.push(vecin);
                nou[vecin.lin][vecin.col]=nou[curent.lin][curent.col]+1;
            }
        }
    }
}
int existatraseu(lincol start,lincol dest,int prag)
{
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if(nou[i][j]-1<prag)///sunt cu 1 in plus
                verif[i][j]=-1;
            else
                verif[i][j]=0;
        }
    verif[start.lin][start.col]=1;
    q.push(start);
    while(!q.empty())
    {
        lincol curent=q.front();
        q.pop();
        for(int i=0;i<=3;i++)
        {
            lincol vecin;
            vecin.lin=curent.lin+di[i];
            vecin.col=curent.col+dj[i];
            if(bariera(vecin) && verif[vecin.lin][vecin.col]==0)
            {
               q.push(vecin);
               verif[vecin.lin][vecin.col]=verif[curent.lin][curent.col]+1;
            }
        }
    }
    return verif[dest.lin][dest.col]-1;
}
int cautbin(int st,int dr)
{
    int rasp=-1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(existatraseu(inceput,destinatia,mij)>0)
        {

            rasp=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    return rasp;
}
int main()
{
    in>>n>>m;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            in>>c[i][j];

            if(c[i][j]=='*')
                nou[i][j]=-2;

            lincol D;
            D.lin=i;
            D.col=j;
            if(c[i][j]=='D')
            {
                 dragon.push(D);
                 nou[i][j]=1;
            }


            if(c[i][j]=='I')
            {
                inceput.lin=i;
                inceput.col=j;
            }
            if(c[i][j]=='O')
            {
                destinatia.lin=i;
                destinatia.col=j;
            }
        }

    lee();
    out<<cautbin(1,n*m)<<'\n';
    /*for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
            if(nou[i][j]!=-2)
                out<<nou[i][j]-1<<' ';
            else
                out<<nou[i][j]<<' ';
        out<<'\n';
    }*/
    return 0;
}