Pagini recente » Cod sursa (job #1374582) | Cod sursa (job #1789635) | Cod sursa (job #1959330) | Cod sursa (job #2683305) | Cod sursa (job #2360667)
#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;
}
}
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]=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;
}