Cod sursa(job #2760823)

Utilizator KarinAAndrei Karina KarinA Data 29 iunie 2021 11:18:22
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.06 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

ifstream in ("barbar.in");
ofstream out ("barbar.out");

int n,m;
int v[1022][1022],mat[1022][1022],vizitat[1020][1020];
int stlin,stc,finlin,finc;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};

queue<pair<int,int>> q;

bool verif(int i,int j)
{
    if(i<1 || j<1 || i>n || j>m)
        return false;
    if(v[i][j]==-1)
        return false;
    return true;
}

void lee()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(v[i][j]==0)
                v[i][j]=1e7;
        }
    }
    while(!q.empty())
    {
        int lin=q.front().first;
        int col=q.front().second;
        q.pop();
        for(int i=0;i<4;i++)
        {
            int newlin=lin+dx[i];
            int newcol=col+dy[i];
            if(verif(newlin,newcol) && v[lin][col]+1<v[newlin][newcol])
            {
                v[newlin][newcol]=v[lin][col]+1;
                q.push(make_pair(newlin,newcol));
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(v[i][j]==1e7)
                v[i][j]=-1;
            else if(v[i][j]>0)
                v[i][j]--;
        }
    }
}

int solve(int nr)
{
    if(v[stlin][stc]<nr)
        return 1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            mat[i][j]=1e7;
            vizitat[i][j]=0;
        }
    }
    mat[stlin][stc]=0;
    vizitat[stlin][stc]=1;
    q.push(make_pair(stlin,stc));
    while(!q.empty())
    {
        int l=q.front().first;
        int c=q.front().second;
        q.pop();
        for(int i=0;i<4;i++)
        {
            int lnou=l+dx[i];
            int cnou=c+dy[i];
            if(verif(lnou,cnou) && v[lnou][cnou]>=nr && vizitat[lnou][cnou]==0)
            {
                vizitat[lnou][cnou]=1;
                mat[lnou][cnou]=mat[l][c];
                q.push(make_pair(lnou,cnou));
            }
        }
    }
    if(mat[finlin][finc]==0)
        return 0;
    return 1;
}

int main()
{
    in>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            char car;
            in>>car;
            if(car=='D')
            {
                q.push(make_pair(i,j));
                v[i][j]=1;
            }
            if(car=='I')
            {
                stlin=i;
                stc=j;
            }
            if(car=='O')
            {
                finlin=i;
                finc=j;
            }
            if(car=='*')
            {
                v[i][j]=-1;
            }
        }
    }
    lee();
    int st=1,dr=n*m;
    int rez=0;
    while(st<=dr)
    {
        int mijloc=(st+dr)/2;
        int sol=-1;
        sol=solve(mijloc);
        if(sol==0)
        {
            st=mijloc+1;
            rez=mijloc;
        }
        else
            dr=mijloc-1;
    }
    if(rez)
        out<<rez<<'\n';
    else
        out<<-1<<'\n';
    return 0;
}