Cod sursa(job #2360674)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 2 martie 2019 00:39:18
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 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;
bool fr[1009][1009];
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){
    if(a[xstart][ystart]<x)
        return 0;
    if(a[xstop][ystop]<x||a[xstop][ystop]==0)
        return 0;
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&&fr[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]=0;
                b[i][j]=1;
                fr[i][j]=1;
            }
            else if(car=='O')
            {
                xstop=i;
                ystop=j;
            }
            else if(car=='I')
            {
                fr[i][j]=1;
                xstart=i;
                ystart=j;
            }
            else if(car=='*'){
                fr[i][j]=1;
                b[i][j]=1;
                a[i][j]=-1;
            }
        }
    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&&b[in][jn]==0)
            {
                b[in][jn]=1;
                a[in][jn]=a[actx][acty]+1;
                coada.push_back({in,jn});
            }
        }
    }
int    st=0;
 int    dr=1000001;
 int mid;
    while(st<=dr){
    mid=(st+dr)/2;
    if(verif(mid)==0)
    dr=mid-1;
    else
    st=mid+1;
    }
    fout<<dr;

}