Cod sursa(job #3266220)

Utilizator Tudor_CCTudor Cocu Tudor_CC Data 6 ianuarie 2025 17:03:03
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <bits/stdc++.h>

using namespace std;

bool z[1005][1005];

int l[1005][1005];

int ll[15],cc[15];

deque <int> qi;
deque <int> qj;

int g[1005][1005];

int main()
{
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    int n,m,ax,ay,bx,by;
    cin>>n>>m;
    char cr;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            l[i][j]=INT_MAX;
            cin>>cr;
            if(cr=='*')
            {
                z[i][j]=1;
            }
            else if(cr=='I')
            {
                ax=i;
                ay=j;
            }
            else if(cr=='O')
            {
                bx=i;
                by=j;
            }
            else if(cr=='D')
            {
                qi.push_back(i);
                qj.push_back(j);
                l[i][j]=0;
            }
        }
    }
    ll[1]=-1;
    ll[2]=0;
    ll[3]=0;
    ll[4]=1;
    cc[1]=0;
    cc[2]=-1;
    cc[3]=1;
    cc[4]=0;
    while(qi.size())
    {
        for(int h=1;h<=4;++h)
        {
            int ii,jj;
            ii=qi.front()+ll[h];
            jj=qj.front()+cc[h];
            if(ii>=1 && ii<=n && jj>=1 && jj<=m && (l[qi.front()][qj.front()]+1)<l[ii][jj] && z[ii][jj]==0)
            {
                l[ii][jj]=(l[qi.front()][qj.front()]+1);
                qi.push_back(ii);
                qj.push_back(jj);
            }
        }
        qi.pop_front();
        qj.pop_front();
    }
    int st=0,dr=1005*1005,mij,in=-1,cnt=0;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        ++cnt;
        if(mij<=l[ax][ay])
        {


            qi.push_back(ax);
            qj.push_back(ay);
            g[ax][ay]=cnt;
            while(qi.size())
            {
                for(int h=1;h<=4;++h)
                {
                    int ii,jj;
                    ii=qi.front()+ll[h];
                    jj=qj.front()+cc[h];
                    if(ii>=1 && ii<=n && jj>=1 && jj<=m && mij<=l[ii][jj] && g[ii][jj]!=cnt && z[ii][jj]==0)
                    {
                        g[ii][jj]=cnt;
                        qi.push_back(ii);
                        qj.push_back(jj);
                    }
                }
                qi.pop_front();
                qj.pop_front();
            }
        }
        if(g[bx][by]!=cnt)
        {
            dr=mij-1;
        }
        else
        {
            st=mij+1;
            in=mij;
        }
    }
    cout<<in;
    return 0;
}