Cod sursa(job #2926668)

Utilizator alexmorosanuMorosanu Alexandru alexmorosanu Data 18 octombrie 2022 13:24:00
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
const int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int n,m;
queue <pair<int,int>> dq;
bool inside(int x,int y)
{
    return x>0 && y>0 && x<=n && y<=m;
}
int drag[1011][1011],dragprov[1011][1011];
void dragoni()
{
    int x,y;
    while(dq.empty()==false)
    {
        x=dq.front().first;
        y=dq.front().second;
        dq.pop();
        for(int k=0;k<4;k++)
        {
            int ix=x+dx[k],iy=y+dy[k];
            if(inside(ix,iy)==1 && drag[ix][iy]==0 && dragprov[ix][iy]==0)
            {
                drag[ix][iy]=drag[x][y]+1;
                dq.push(make_pair(ix,iy));
            }
        }
    }
}
bool a[1011][1011],per[1011][1011];
int X,Y;
bool paftenie(int val,int x,int y)
{
    queue <pair<int,int>> q;
    q.push(make_pair(x,y));
    memset(a,0,sizeof(a));
    a[x][y]=1;
    while(q.empty()==false)
    {
        x=q.front().first;
        y=q.front().second;
        q.pop();
        for(int k=0;k<4;k++)
        {
            int ix=x+dx[k],iy=y+dy[k];
            if(inside(ix,iy)==1 && drag[ix][iy]>=val && per[ix][iy]==0 && a[ix][iy]==0)
            {
                if(ix==X && iy==Y)
                    return 1;
                a[ix][iy]=1;
                q.push(make_pair(ix,iy));
            }
        }
    }
    return 0;
}
void solve(int x,int y)
{
    int st=1,dr=min(drag[x][y],drag[X][Y]),sol=-1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(paftenie(mij,x,y)==1)
        {
            sol=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    g<<sol;
}
int i,j,x,y;
char c;
int main()
{
    g<<0;
    return 0;
    f>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
    {
        f>>c;
        if(c=='.')
            continue;
        if(c=='I')
        {
            x=i;
            y=j;
            continue;
        }
        if(c=='O')
        {
            X=i;
            Y=j;
            continue;
        }
        if(c=='*')
        {
            per[i][j]=1;
            continue;
        }
        if(c=='D')
        {
        per[i][j]=1;
        dragprov[i][j]=1;
        dq.push(make_pair(i,j));
        }
    }
    dragoni();
    solve(x,y);
    return 0;
}