Cod sursa(job #2664032)

Utilizator marcumihaiMarcu Mihai marcumihai Data 27 octombrie 2020 19:58:49
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f ("barbar.in");
ofstream g ("barbar.out");
int n,m;
int mt[1005][1005];
int dragon[1005][1005];
int a , b , y , z;
queue <pair<int , int>> Q;
int di[4]= {0,0,1,-1};
int dj[4]= {1,-1,0,0};
int okD(int i, int j)
{
    if(i<1 || j<1 || i>n || j>m)
        return 0;
    if(dragon[i][j]!=0)
        return 0;
    return 1;
}
void LeeD()
{
    while(!Q.empty())
    {
        int i=Q.front().first;
        int j=Q.front().second;
        for(int x=0; x<4; ++x)
            if(okD(i+di[x], j+dj[x]))
               {
                   Q.push({i+di[x], j+dj[x]});
                   dragon[i+di[x]][j+dj[x]]=dragon[i][j]+1;
               }
        Q.pop();

    }

}
int ok(int i, int j, int k )
{
    if(i<1 || j<1 || i>n || j>m)
        return 0;
    if(dragon[i][j]<=k || mt[i][j]!=0)
        return 0;
    return 1;

}
int Lee(int ap)
{
    while(!Q.empty())
        Q.pop();
    Q.push({a,b});
    while(!Q.empty())
    {
        int i=Q.front().first;
        int j=Q.front().second;
        if(i==y && j==z)
            return 1;
        for(int x=0; x<4; ++x)
        {
            if(ok(i+di[x] , j+dj[x] , ap))
            {
                Q.push({i+di[x] , j+dj[x]});
                mt[i+di[x]][j+dj[x]]=1;
            }
        }
        Q.pop();

    }
    return 0;
}
int main()
{
    char c;
    f>>n>>m;
    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=m; ++j)
        {
            f>>c;
            if(c=='I')
            {
                a=i;
                b=j;
            }
            if(c=='O')
            {
                y=i;
                z=j;
            }
            if(c=='*')
                mt[i][j]=-1;
            if(c=='D')
            {
                Q.push({i,j});
                dragon[i][j]=1;
            }
        }
    }
    LeeD();
    int st=1;
    int dr=n*m;
    int mij=(st+dr)/2;
    int raspuns=-1;
    while(st<=dr)
    {
        if(Lee(mij))
        {
            raspuns=mij;
            st=mij+1;
            for(int i=1;i<=n;++i)
                for(int j=1;j<=m;++j)
                    if(mt[i][j]==1)
                        mt[i][j]=0;
        }
        else
            dr=mij-1;
        mij=(st+dr)/2;
    }
    g<<raspuns;
    return 0;
}