Cod sursa(job #2706067)

Utilizator Amelia_MilcuMilcu Amelia Amelia_Milcu Data 13 februarie 2021 18:40:29
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
#include <queue>
#define DIM 1001
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct barbar
{
    int l,c;
};
queue<barbar> q,v;
int n,m,xs,ys,xf,yf,b[DIM][DIM];
bool f[DIM][DIM];
int dx[]= {1,-1,0,0},dy[]= {0,0,1,-1};
char c;
bool verif(int i,int j)
{
    if(i> 0 && j>0 && i<=n && j<=m)
        return 1;
    return 0;
}
bool drum(int x)
{
    if(b[xs][ys]<=x)
        return 0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            f[i][j]=0;
    while(!v.empty())
        v.pop();
    f[xs][ys]=1;
    v.push({xs,ys});
    while(!v.empty())
    {
        barbar poz=v.front();
        v.pop();
        for(int d=0; d<4; d++)
        {
            barbar poz1;
            poz1.l=poz.l+dx[d];
            poz1.c=poz.c+dy[d];
            if(verif(poz1.l,poz1.c))
                if(!f[poz1.l][poz1.c] && b[poz1.l][poz1.c]>x)
                {
                    if(poz1.l==xf && poz1.c==yf)
                        return 1;
                    v.push(poz1);
                      f[poz1.l][poz1.c]=1;
                }
        }
    }
    return 0;
}
int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            fin>>c;
            if(c=='I')
                xs=i, ys=j;
            if(c=='O')
                xf=i, yf=j;
            if(c=='D')
                q.push({i,j}),b[i][j]=1;
            if(c=='*')
                b[i][j]=-1;
        }
    while(!q.empty())
    {
        barbar poz=q.front();
        q.pop();
        for(int d=0; d<4; d++)
        {
            barbar poz1;
            poz1.l=poz.l+dx[d];
            poz1.c=poz.c+dy[d];
            if(verif(poz1.l,poz1.c))
                if(!b[poz1.l][poz1.c])
                {
                    b[poz1.l][poz1.c]=1+b[poz.l][poz.c];
                    q.push(poz1);
                }
        }
    }
    int st=1,dr=2005,mid,nr=-1;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(drum(mid))
            nr=mid,st=mid+1;
        else
            dr=mid-1;
    }
    fout<<nr;

    return 0;
}