Cod sursa(job #2191826)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 3 aprilie 2018 20:06:50
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

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

const int NMAX = 1005;

int dx[]={0,1,-1,0,0};
int dy[]={0,0,0,-1,1};

int v[NMAX][NMAX];
int n,m;
bool viz[NMAX][NMAX];

string s[NMAX];
pair<int,int> start,sfarsit;
queue <pair <int,int> > q;

bool drum(int val)
{
    q.push(start);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            viz[i][j]=0;
    while(!q.empty())
    {
        pair<int,int> aux=q.front();
        q.pop();
        for(int i=1;i<=4;i++)
        {
            int vx=aux.first+dx[i];
            int vy=aux.second+dy[i];
            if(s[vx][vy]='*' and v[vx][vy]>=val and viz[vx][vy]==0)
            {
                viz[vx][vy]=1;
                q.push({vx,vy});
            }
        }
    }
    return viz[sfarsit.first][sfarsit.second];
}

int main()
{
    fin >> n >> m;
    s[0]=string(m+1,'*');
    s[n+1]=string(m+1,'*');
    for(int i=1;i<=n;i++)
    {
        fin >> s[i];
        s[i]="*"+s[i]+"*";
        for(int j=1;j<=m;j++)
        {
            if(s[i][j]=='D')
            {
                q.push({i,j});
                v[i][j]=1;
            }
            if(s[i][j]=='I')
            {
                start={i,j};
            }
            if(s[i][j]=='O')
            {
                sfarsit={i,j};
            }
        }
    }
    while(!q.empty())
    {
        pair<int,int> aux=q.front();
        q.pop();
        for(int i=1;i<=4;i++)
        {
            int vx=aux.first+dx[i];
            int vy=aux.second+dy[i];
            if(s[vx][vy]!='*' and v[vx][vy]==0)
            {
                v[vx][vy]=v[aux.first][aux.second]+1;
                q.push({vx,vy});
            }
        }
    }
    int st=2;
    int sol=0;
    int dr=n*m;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(drum(mij)==1)
        {
            st=mij+1;
            sol=mij;
        }
        else dr=mij-1;
    }

    fout << sol-1;
    return 0;
}