Cod sursa(job #2358569)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 28 februarie 2019 10:22:33
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <iostream>
#include <set>
#include <fstream>
#include <deque>
#include <bitset>
using namespace std;
deque <pair<int,int> > coada;
int a[1009][1009],i,j,n,m,xstart,ystart,actx,acty,dir,in,jn,xstop,ystop;
char car;
int lin[]={-1,1,0,0};
int col[]={0,0,-1,1};
bitset <1009> b[1009];
ifstream fin("barbar.in");
ofstream fout("barbar.out");
bool verif(int x){
coada.clear();
for(int i=1;i<=1002;i++)
b[i].reset();
coada.push_back({xstart,ystart});
while(coada.empty()==0){
actx=coada.front().first;
        acty=coada.front().second;
        coada.pop_front();
        for(dir=0; dir<=3; dir++)
        {
            in=actx+lin[in];
            jn=acty+col[in];
            if(in>=1&&in<=n&&jn>=1&&jn<=m&a[in][jn]<=x&&b[in][jn]==0)
            {
        if(in==xstop&&jn==ystop)
        return 1;
                coada.push_back({in,jn});

            }
        }

}

return 0;
}
int main()
{
    fin>>n>>m;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            fin>>car;
            if(car=='D')
            {
                coada.push_back({i,j});
                a[i][j]=1;
            }
            else if(car=='O')
            {
                a[i][j]=-2;
                xstop=i;
                ystop=j;
            }
            else if(car=='I')
            {
                a[i][j]=-1;
                xstart=i;
                ystart=j;
            }
        }
    while(coada.empty()==0)
    {
        actx=coada.front().first;
        acty=coada.front().second;
        coada.pop_front();
        for(dir=0; dir<=3; dir++)
        {
            in=actx+lin[in];
            jn=acty+col[in];
            if(in>=1&&in<=n&&jn>=1&&jn<=m&&a[in][jn]==0)
            {
                a[in][jn]=a[i][j]+1;
                coada.push_back({in,jn});

            }
        }
    }
int    st=1;
 int    dr=3000;
    while(st<=dr){
 int    mid=st+dr;
    mid/=2;
    if(verif(mid)==1)
    dr=mid-1;
    else
    st=mid+1;
    }
    fout<<dr;

}