Cod sursa(job #2092041)

Utilizator PopeangaMihneaPopeanga Mihnea- Stefan PopeangaMihnea Data 20 decembrie 2017 20:45:15
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

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

struct poz
{
    int l, c;
}start, stop;

int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
queue<poz>coada;
int nr[1002][1002], M[1002][1002];
int n, m, st, dr, mij;
char ch;

void lee()
{
    poz p, q;
    int lv, cv;
    while(!coada.empty())
    {
        p=coada.front();
        coada.pop();
        for(int d=0; d<4; ++d)
        {
            lv=p.l+dx[d];
            cv=p.c+dy[d];
            if(lv>0 && lv<=n && cv>0 && cv<=m)
            {
                if(nr[lv][cv]==0)
                {
                    nr[lv][cv]=nr[p.l][p.c]+1;
                    q.l=lv; q.c=cv;
                    coada.push(q);
                }
            }
        }
    }
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=m; ++j)
        {
            fin>>ch;
            if(ch=='*') nr[i][j]=-1;
            else
            {
                if(ch=='I')
                {
                    start.l=i;
                    start.c=j;
                }
                if(ch=='O')
                {
                    stop.l=i;
                    stop.c=j;
                }
                if(ch=='D')
                {
                    poz q;
                    q.l=i; q.c=j;
                    coada.push(q);
                    nr[i][j]=1;
                }
            }
        }
    }
    lee();
    /*for(int i=1; i<=n; ++i)
    {
        for(int j=1; j<=m; ++j) fout<<nr[i][j]<<" ";
        fout<<"\n";
    }*/
    st=1; dr=max(n, m);
    bool sol=0;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        while(!coada.empty()) coada.pop();
        if(mij>nr[start.l][start.c])
        {
            dr=mij-1;
            continue;
        }
        else
        {
            poz p, q;
            int lv, cv;
            coada.push(start);
            M[start.l][start.c]=mij;
            bool gasit=0;
            while(!coada.empty() && !gasit)
            {
                p=coada.front();
                coada.pop();
                for(int d=0; d<4; ++d)
                {
                    lv=p.l+dx[d];
                    cv=p.c+dy[d];
                    if(lv>0 && lv<=n && cv>0 && cv<=m)
                    {
                        if(nr[lv][cv]>=mij && M[lv][cv]!=mij)
                        {
                            M[lv][cv]=mij;
                            q.l=lv; q.c=cv;
                            if(lv==stop.l && cv==stop.c) gasit=1;
                            coada.push(q);
                        }
                    }
                }
            }
            if(gasit)
            {
                st=mij+1;
                sol=1;
            }
            else dr=mij-1;
        }
    }
    if(sol) fout<<dr-1<<"\n";
    else fout<<"-1";
    return 0;
}