Cod sursa(job #2907927)

Utilizator luca.prunoiuluca prunoiu luca.prunoiu Data 31 mai 2022 22:34:09
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.86 kb
#include <fstream>
#include <queue>

using namespace std;

const int N=1010;
int N_piv, M_piv;
bool mat_castle[N][N];
int dist_dragoni[N][N];
struct coord
{
    int l,c;
};

queue<coord>dragons_queue;
queue<coord>qu_wayon;
coord start,fin;
const int lin[4]={-1,0,1,0};
const int col[4]={0,-1,0,1};

bool in_mat(coord next_poz)
{
    return next_poz.l>=0 && next_poz.l<N_piv && next_poz.c>=0 && next_poz.c<M_piv;
}

void lee_dr()
{
    while(!dragons_queue.empty())
    {
        coord cur=dragons_queue.front();
        dragons_queue.pop();
        for(int i=0;i<=3;i++)
        {
            coord urm;
            urm.l=cur.l+lin[i];
            urm.c=cur.c+col[i];
            if(in_mat(urm) && dist_dragoni[urm.l][urm.c]==0)
            {
                dist_dragoni[urm.l][urm.c]=dist_dragoni[cur.l][cur.c]+1;
                dragons_queue.push(urm);
            }
        }
    }
}
void principal_lee(int dist_to_dr)
{
    qu_wayon.push(start);
    mat_castle[start.l][start.c]=1;
    while(!qu_wayon.empty())
    {
        coord cur=qu_wayon.front();
        qu_wayon.pop();
        for(int i=0;i<=3;i++)
        {
            coord urm;
            urm.l=cur.l+lin[i];
            urm.c=cur.c+col[i];
            if(in_mat(urm) && dist_dragoni[urm.l][urm.c]>=dist_to_dr && mat_castle[urm.l][urm.c]==0)
            {
                mat_castle[urm.l][urm.c]=1;
                qu_wayon.push(urm);
            }
        }
    }
}
bool is_way(int d)
{
    for(int i=0 ;i<N_piv;i++)
        for(int j=0 ; j<M_piv;j++)
            mat_castle[i][j]=0;
    principal_lee(d);
    if(mat_castle[fin.l][fin.c]!=0)
        return true;
    return false;
}

int main()
{
    ifstream in("barbar.in");
    ofstream out("barbar.out");
    in>>N_piv>>M_piv;
    in.get();
    for(int i=0;i<N_piv;i++)
    {
        for(int j=0;j<M_piv;j++)
        {
            char c;
            in.get(c);
            if(c=='D')
            {
                coord dragon;
                dragon.l=i;
                dragon.c=j;
                dragons_queue.push(dragon);
                dist_dragoni[i][j]=1;
            }
            else if(c=='I')
            {
                start.l=i;
                start.c=j;
            }
            else if(c=='*')
            {
                dist_dragoni[i][j]=-1;
            }
            else if(c=='O')
            {
                fin.l=i;
                fin.c=j;
            }
        }
        in.get();
    }
    lee_dr();
    int st=0, dr=dist_dragoni[start.l][start.c], dist_max=0;
    while(st<=dr)
    {
        int dist=(st+dr)/2;
        if(dist != 0 && is_way(dist))
        {
            dist_max=dist;
            st=dist+1;
        }
        else
            dr=dist-1;
    }
    out<< dist_max-1 ;
    in.close();
    out.close();
    return 0;
}