Cod sursa(job #2358641)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 28 februarie 2019 10:54:43
Problema Barbar Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 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.size()>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&&a[in][jn]!=1&&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]=-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[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=1;
 int    dr=500001;
 int mid;
    while(st<=dr){
    mid=(st+dr)/2;
    if(verif(mid)==1)
    dr=mid-1;
    else
    st=mid+1;
    }
    if(dr==0){
        fout<<-1;
        return 0;
    }
    fout<<dr;
//for(i=1;i<=n;i++){
//    for(j=1;j<=m;j++)
//        fout<<a[i][j]<<" ";
 //   fout<<"\n";
//}
}