Cod sursa(job #2981475)

Utilizator Darius1414Dobre Darius Adrian Darius1414 Data 18 februarie 2023 01:05:37
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <fstream>
#define nmx 1001
#include <queue>
using namespace std;
int ctd,n,m,v[nmx][nmx],vf[nmx][nmx],sx,sy,fx,fy,di[4]= {0,0,1,-1},dj[4]= {-1,1,0,0},dragon[nmx][nmx];
queue <pair<int,int>> myq;
char c;
void bfs()
{
    while (myq.size())
    {
        int i1,j1;
        i1=myq.front().first;
        j1=myq.front().second;
        myq.pop();
        for (int i=0; i<=3; i++)
        {
            int i2,j2;
            i2=i1+di[i];
            j2=j1+dj[i];
            if (i2>=1 && i2<=n && j2>=1 && j2<=m && dragon[i2][j2]==0 && v[i2][j2]==0)
            {
                dragon[i2][j2]=dragon[i1][j1]+1;
                myq.push(make_pair(i2,j2));
            }
        }
    }
}
void dfs (int li,int co,int dist)
{
    if (dragon[li][co]<dist) return;
    vf[li][co]=1;
    for (int i=0;i<=3;i++)
    {
        int ln=li+di[i];
        int cn=co+dj[i];
        if (ln>=1 && ln<=n && cn>=1 && cn<=m && vf[ln][cn]==0 && dragon[ln][cn]>=dist && v[ln][cn]==0)
            dfs(ln,cn,dist);
    }
}
bool verif (int dist)
{
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
            vf[i][j]=0;
    dfs(sx,sy,dist);
    return vf[fx][fy];
}
int main()
{
    ifstream f ("barbar.in");
    ofstream g ("barbar.out");
    f>>n>>m;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
        {
            f>>c;
            if (c=='D')
            {
                myq.push({i,j});
                dragon[i][j]=1;
            }
            if (c=='I')
            {
                sx=i;
                sy=j;
            }
            if (c=='O')
            {
                fx=i;
                fy=j;
            }
            if (c=='*')
                v[i][j]=1;
        }
    bfs();
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            dragon[i][j]--;
    int st=0,dr=n*m,mid,sol=-1;
    while (st<=dr)
    {
        mid=(st+dr)/2;
        bool test=verif(mid);
        if (test==1)
        {
            sol=mid;
            st=mid+1;
        }
        else dr=mid-1;
    }
    g<<sol;
}