Cod sursa(job #2323140)

Utilizator Andrei_RAndrei Roceanu Andrei_R Data 18 ianuarie 2019 21:21:39
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include<fstream>
#include<queue>
using namespace std;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int n,m,i,j,xf,yf,xs,ys,Bp[1005][1005],A[1005][1005],D[1005][1005],rez;
deque<pair<int,int> > Q;
pair<int,int> vf;
char S[1005];

bool check(int dist)
{
    int i,j;
    if(D[xs][ys]<=dist)
        return 0;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            A[i][j]=0;
    A[xs][ys]=1;
    Q.push_back({xs,ys});
    while(!Q.empty())
    {
        vf=Q.front();
        Q.pop_front();
        for(int d=0; d<4; d++)
        {
            if(Bp[vf.first+dx[d]][vf.second+dy[d]]!=-1 && D[vf.first+dx[d]][vf.second+dy[d]]>dist && A[vf.first+dx[d]][vf.second+dy[d]]==0)
            {
                A[vf.first+dx[d]][vf.second+dy[d]]=1;
                Q.push_back({vf.first+dx[d],vf.second+dy[d]});
            }
        }
    }
    return A[xf][yf];
}

int main()
{
    fi>>n>>m;
    for(i=1; i<=n; i++)
    {
        fi>>S;
        for(j=1; j<=m; j++)
        {
            if(S[j-1]=='I')
            {
                xf=i;
                yf=j;
            }
            if(S[j-1]=='D')
            {
                Q.push_back({i,j});
                D[i][j]=1;
            }
            if(S[j-1]=='O')
            {
                xs=i;
                ys=j;
            }
            if(S[j-1]=='*')
                Bp[i][j]=-1;
        }
    }
    for(i=1; i<=n; i++)
        Bp[i][0]=Bp[i][m+1]=-1;
    for(j=1; j<=m; j++)
        Bp[0][j]=Bp[n+1][j]=-1;
    while(!Q.empty())
    {
        vf=Q.front();
        Q.pop_front();
        for(int d=0; d<4; d++)
        {
            if(Bp[vf.first+dx[d]][vf.second+dy[d]]!=-1 && D[vf.first+dx[d]][vf.second+dy[d]]==0)
            {
                D[vf.first+dx[d]][vf.second+dy[d]]=1+D[vf.first][vf.second];
                Q.push_back({vf.first+dx[d],vf.second+dy[d]});
            }
        }
    }
    rez=0;
    for(i=11; i>=0; i--)
        if(check(rez+(1<<i)))
            rez=rez+(1<<i);
    if(rez==0 && !check(0))
        fo<<"-1";
    else
        fo<<rez<<"\n";
    fi.close();
    fo.close();
    return 0;
}