Cod sursa(job #2575040)

Utilizator levladiatorDragutoiu Vlad-Ioan levladiator Data 6 martie 2020 11:20:04
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda ultimasansa Marime 3.59 kb
#include <bits/stdc++.h>
#define NMAX 1005
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
vector < int > cdx,cdy,drgx,drgy;

int dragoni,n,m,rasp=-1,xs,ys,xu,yu,u,st,dr,mij,distmin,x,y,p,z;
int lee[NMAX][NMAX];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
bool aux[NMAX][NMAX];
char v[NMAX][NMAX];

void bordare()
{
    for(int i=0;i<=n+1;i++)
        lee[i][0]=lee[i][m+1]=-1;

    for(int i=0;i<=m+1;i++)
        lee[0][i]=lee[n+1][i]=-1;
}
void citire()
{
    fin>>n>>m;
    char car;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            fin>>car;
            v[i][j]=car;
            if(car=='D')
            {
                drgx.push_back(i);
                drgy.push_back(j);
                dragoni++;
                aux[i][j]=1;
            }
            else if(car=='*')aux[i][j]=1;
            else if(car=='I')
            {
                xs=i;
                ys=j;
            }
            else if(car=='O')
            {
                xu=i;
                yu=j;
            }
        }
    }
    bordare();
}
void refresh()
{
    cdx.clear();
    cdy.clear();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            lee[i][j]=0;
        }
    }
}
bool inside(int x,int y)
{
    if(x>=1&&x<=n&&y>=1&&y<=m)return 1;
    return 0;
}
void fill(int x,int y)
{
    cdx.push_back(x);
    cdy.push_back(y);
    p=u=0;
    while(p<=u)
    {
        x=cdx[p];
        y=cdy[p];
        z=lee[x][y];
        if(-z<mij)
        {
            for(int i=0;i<4;i++)
            {
                int xf=x+dx[i];
                int yf=y+dy[i];
                if(aux[xf][yf]==0&&lee[xf][yf]==0)
                {
                    cdx.push_back(xf);
                    cdy.push_back(yf);
                    lee[xf][yf]=z-1;
                    u++;
                }
            }
        }
        p++;
    }
    cdx.clear();
    cdy.clear();
}
void marcare()
{
    for(int i=0;i<dragoni;i++)
    {
        lee[drgx[i]][drgy[i]]=-1;
        fill(drgx[i],drgy[i]);
    }
}
void alglee()
{
    cdx.push_back(xs);
    cdy.push_back(ys);
    p=u=0;
    while(p<=u)
    {
        x=cdx[p];
        y=cdy[p];
        z=lee[x][y];
        for(int i=0;i<4;i++)
        {
            int xf=x+dx[i];
            int yf=y+dy[i];
            if(aux[xf][yf]==0&&lee[xf][yf]==0)
            {
                cdx.push_back(xf);
                cdy.push_back(yf);
                lee[xf][yf]=z+1;
                u++;
            }
        }
        p++;
    }
}
void solve()
{
    st=0;
    dr=distmin;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        marcare();
        alglee();
        if(lee[xu][yu]>0)
        {
            rasp=mij;
            st=mij+1;
        }
        else dr=mij-1;
        refresh();
    }
}
int main()
{
    citire();
    cdx.push_back(xs);
    cdy.push_back(ys);
    while(p<=u&&!distmin)
    {
        x=cdx[p];
        y=cdy[p];
        z=lee[x][y];
        for(int i=0;i<4;i++)
        {
            int xf=x+dx[i];
            int yf=y+dy[i];
            if(aux[xf][yf]==0&&lee[xf][yf]==0)
            {
                cdx.push_back(xf);
                cdy.push_back(yf);
                lee[xf][yf]=z+1;
                u++;
            }
            else if(v[xf][yf]=='D')
            {
                distmin=z+1;
                break;
            }
        }
        p++;
    }
    refresh();
    solve();
    if(rasp==-1)fout<<-1;
    else fout<<rasp;

}