Cod sursa(job #2067669)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 16 noiembrie 2017 18:54:47
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.05 kb
#include <iostream>
#include <fstream>
#include <deque>

#define NMAX 1001

using namespace std;

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

int i,j,n,m,ok,xout,yout,xi,yi,xf,yf,xc,yc,xin,yin,mij;
int v[NMAX][NMAX],v2[NMAX][NMAX];
int dx[]={0, 0, 0, 1, -1};
int dy[]={0, 1, -1, 0, 0};

int Interior(int a,int b)
{
    if(a<=n && a>=1 && b<=m && b>=1) return 1;
    return 0;
}

deque <pair<int ,int> > q;
pair <int ,int> aux;
char a;

int main()
{
    fin >> n >> m;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            fin >> a;
            if(a=='*') /// Perete
                v[i][j]=-1;
            if(a=='D') /// Dragon
            {
                q.push_back(make_pair(i,j));
                v[i][j]=1;
            }
            if(a=='I')
            {
                xin=i; /// coordonate de intrare (al lui Paftenie)
                yin=j;
            }
            if(a=='O')
            {
                xout=i; /// coordonate de iesire din pivnita
                yout=j;
            }
        }
    }
    while(!q.empty())
    {
        aux=q.front();
        q.pop_front();
        for(i=1;i<=4;i++)
        {
            if(v[aux.first+dx[i]][aux.second+dy[i]]==0 and Interior(aux.first+dx[i],aux.second+dy[i])==1)
            {
                v[aux.first+dx[i]][aux.second+dy[i]]=v[aux.first][aux.second]+1;
                aux.first=aux.first+dx[i];
                aux.second=aux.second+dy[i];
                q.push_back(aux); /// c.push_back(make_pair(aux.first,aux.second)); ????
            }
        }
    }
    /// PARTEA CU CAUTAREA BINARA ============>>
    int st=1,dr=max(n,m);
    int ok=1,ok2;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        aux.first=xin;
        aux.second=yin;
        while(!q.empty()) q.pop_front();
        if(mij>v[xin][yin]) /// v[xin][yin] e cea mai aporpiata distanta de un dragon
        {
            dr=mij-1;
            continue;
        }
        v2[xin][yin]=mij;
        q.push_back(make_pair(aux.first,aux.second)); /// q.push_back(make_pair(aux.first,aux.second)) ?
        ok2=0;
        while(!q.empty() and ok2==0)
        {
            aux=q.front();
            q.pop_front();
            for(i=1;i<=4;i++)
            {
                if(v[aux.first+dx[i]][aux.second+dy[i]]>=mij and Interior(aux.first+dx[i],aux.second+dy[i]) and v2[aux.first+dx[i]][aux.second+dy[i]]!=mij)
                {
                    v2[aux.first+dx[i]][aux.second+dy[i]]=mij;
                    aux.first=aux.first+dx[i];
                    aux.second=aux.second+dy[i];
                    q.push_back(aux); /// q.push_back(make_pair( .....)) ?
                    if(aux.first==xout and aux.second==yout)
                        ok2=1;/// daca se afla la iesirea din temnita (s-a terminat drumul)
                }
            }
        }
        if(ok2==1) /// daca s-a iesit din temnita
            st=mij+1;
        else dr=mij-1;
    }

    if(dr-1>=0) fout << dr-1;
    else fout << -1;
    return 0;
}