Cod sursa(job #2358671)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 28 februarie 2019 11:16:36
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 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();
b[xstart][ystart]=1;
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[dir];
            jn=acty+col[dir];
            if(in>=1&&in<=n&&jn>=1&&jn<=m&&a[in][jn]>=x&&b[in][jn]==0)
            {
            if(in==xstop&&jn==ystop)
            return 1;
            b[in][jn]=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]=2000000000;
                xstop=i;
                ystop=j;
            }
            else if(car=='I')
            {
                a[i][j]=-1;
                xstart=i;
                ystart=j;
            }
            else if(car=='*')
                a[i][j]=-200000000;
        }
    while(coada.empty()==0)
    {
        actx=coada.front().first;
        acty=coada.front().second;
        coada.pop_front();
        for(dir=0; dir<=3; dir++)
        {
            in=actx+lin[dir];
            jn=acty+col[dir];
            if(in>=1&&in<=n&&jn>=1&&jn<=m&&a[in][jn]==0)
            {
                a[in][jn]=a[actx][acty]+1;
                coada.push_back({in,jn});
            }
        }
    }
int    st=2;
 int    dr=500001;
 int mid;
    while(st<=dr){
    mid=(st+dr)/2;
    if(verif(mid)==0)
    dr=mid-1;
    else
    st=mid+1;
    }
    fout<<dr-1;

}