Cod sursa(job #2359178)

Utilizator ApolodorTudor Fernea Apolodor Data 28 februarie 2019 18:19:12
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

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

int n,m,ist,jst,ifin,jfin;
int a[1005][1005],viz[1005][1005],dist[1005][1005],dir[4][2]={1,0,0,1,-1,0,0,-1};

char c;

queue < pair<int,int> > coada;

void lee()
{

    while(!coada.empty())
    {

        int ii=coada.front().first;
        int jj=coada.front().second;
        coada.pop();

        for(int d=0; d<=3; d++)
        {

            int i_urm=ii+dir[d][0];
            int j_urm=jj+dir[d][1];

            if(i_urm<=n && i_urm>=1 && j_urm<=m && j_urm>=1)
                if(viz[i_urm][j_urm]==0 && a[i_urm][j_urm]!=-1)
                {

                    dist[i_urm][j_urm]=dist[ii][jj]+1;
                    viz[i_urm][j_urm]=1;
                    coada.push(make_pair(i_urm,j_urm));

                }

        }

    }

}

bool ok(int val)
{

    coada.push(make_pair(ist,jst));
    viz[ist][jst]=1;
    bool bun=false;

    if(dist[ist][jst]<val)
        return false;

    while(!coada.empty())
    {

        int ii=coada.front().first;
        int jj=coada.front().second;

        coada.pop();

        if(a[ii][jj]==-4)
            bun=true;

        for(int d=0; d<=3; d++)
        {

            int i_urm=ii+dir[d][0];
            int j_urm=jj+dir[d][1];

            if(i_urm<=n && i_urm>=1 && j_urm<=m && j_urm>=1)
                if(viz[i_urm][j_urm]==0 && a[i_urm][j_urm]!=-1 && a[i_urm][j_urm]!=-3)
                    if(dist[i_urm][j_urm]>=val)
                    {

                        viz[i_urm][j_urm]=1;
                        coada.push(make_pair(i_urm,j_urm));

                    }

        }

    }

    return bun;

}

int cautbin()
{

    int st=0;
    int dr=n*m+1;
    int sol=-1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;

        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                viz[i][j]=0;

        if(ok(mij))
        {
            st=mij+1;
            sol=mij;
        }
        else
            dr=mij-1;

    }

    return sol;

}

int main()
{

   fi>>n>>m;
   for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
    {

        fi>>c;

        if(c=='I')
        {
            ist=i;
            jst=j;
            a[i][j]=-2;
        }

        if(c=='D')
        {
            a[i][j]=-3;
            coada.push(make_pair(i,j));
            viz[i][j]=1;

        }

        if(c=='*')
            a[i][j]=-1;

        if(c=='O')
        {
            a[i][j]=-4;
            ifin=i;
            jfin=j;
        }

    }

    lee();

    if(ist==0 || ifin==0)
        fo<<0;
    else
    fo<<cautbin();

   return 0;
}