Cod sursa(job #2544835)

Utilizator filiptudose2007Tudose Filip filiptudose2007 Data 12 februarie 2020 16:08:41
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <bits/stdc++.h>
using namespace std;
int dx[4]= {0,0,1,-1};
int dy[4]= {1,-1,0,0};
int n,m,a[1005][1005],b[1005][1005],d[1005][1005],xi,yi,xf,yf;
queue <pair<int,int>> q;
void bordare(int n, int m)
{
    for(int i=0; i<=n+1; ++i)
    {
        a[i][0]=a[i][m+1]=b[i][0]=b[i][m+1]=d[i][0]=d[i][m+1]=-1;
    }
    for(int i=0; i<=m+1; ++i)
    {
        a[0][i]=a[n+1][i]=b[0][i]=b[n+1][i]=d[0][i]=d[n+1][i]=-1;
    }
}
void reset()
{
    for(int i=0; i<=n+1; ++i)
    {
        ///J
        for(int j=0; j<=m+1; ++j)
        {
            a[i][j]=b[i][j];
        }
    }
}
void Fill(int i, int j, int dst)
{
    a[i][j]=-1;
    for(int p=0; p<4; p++)
    {
        int xx=i+dx[p];
        int yy=j+dy[p];
        if(!a[xx][yy] && d[xx][yy]-1>=dst)
        {
            Fill(xx,yy,dst);
        }
    }
}
void Lee()
{
    while(!q.empty())
    {
        int x=q.front().first;
        int y=q.front().second;
        ///O
        q.pop();
        for(int i=0; i<4; ++i)
        {
            int xx=x+dx[i];
            int yy=y+dy[i];
            if(!d[xx][yy])
            {
                q.push({xx,yy});
                d[xx][yy]=d[x][y]+1;
            }
        }
    }
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    cin.sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m;
    bordare(n,m);
    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=m; ++j)
        {
            char ch;
            cin>>ch;
            ///N
            if(ch=='I')
            {
                xi=i;
                yi=j;
            }
            else if(ch=='O')
            {
                xf=i;
                yf=j;
            }
            else if(ch=='*')
            {
                a[i][j]=-1;
                b[i][j]=-1;
                d[i][j]=-1;
            }
            else if(ch=='D')
            {
                q.push({i,j});
                d[i][j]=1;
            }
        }
    }
    Lee();
    int st=0,dr=n+m;
    int rez=0;
    ///E
    bool ok=false;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        reset();
        Fill(xi,yi,mij);
        if(a[xf][yf]==0 || d[xi][yi]<=mij)
        {
            dr=mij-1;
        }
        else
        {
            ok=true;
            rez=mij;
            st=mij+1;
        }
    }
    if(ok)
        cout<<rez<<'\n';
    else cout<<-1<<'\n';
    ///L
    return 0;
}