Pagini recente » Autentificare | Monitorul de evaluare | Cod sursa (job #153976) | Cod sursa (job #1385945) | Cod sursa (job #2956985)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct ceva
{
int x,y;
}start,finish,p,p1;
queue<ceva>q;
int dx[]={0,-1,0,1,0};
int dy[]={0,0,1,0,-1};
int lee[1010][1010],n,m,i,st,dr,mij,viz[1010][1010],best=-1,d,j;
char mat[1010][1010];
bool in(ceva a)
{
return a.x>=1 && a.x<=n && a.y>=1 && a.y<=m;
}
bool good(int val)
{
if(lee[start.x][start.y]<val)
return false;
q.push(start);
viz[start.x][start.y]=val;
while(!q.empty())
{
p=q.front();
q.pop();
for(d=1;d<=4;d++)
{
p1.x=p.x+dx[d];
p1.y=p.y+dy[d];
if(in(p1) && (mat[p1.x][p1.y]=='.' || mat[p1.x][p1.y]=='O') && lee[p1.x][p1.y]>=val && viz[p1.x][p1.y]!=val)
{
viz[p1.x][p1.y]=val;
q.push(p1);
}
}
}
return viz[finish.x][finish.y]==val;
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fin>>mat[i][j];
lee[i][j]=1e9;
if(mat[i][j]=='D')
{
q.push({i,j});
lee[i][j]=0;
}
if(mat[i][j]=='I')
start={i,j};
if(mat[i][j]=='O')
finish={i,j};
}
while(!q.empty())
{
p=q.front();
q.pop();
for(d=1;d<=4;d++)
{
p1.x=p.x+dx[d];
p1.y=p.y+dy[d];
if(in(p1) && mat[p1.x][p1.y]!='*' && lee[p1.x][p1.y]>lee[p.x][p.y]+1)
{
lee[p1.x][p1.y]=lee[p.x][p.y]+1;
q.push(p1);
}
}
}
st=1;
dr=n*m;
while(st<=dr)
{
mij=(st+dr)/2;
if(good(mij))
{
best=mij;
st=mij+1;
}
else dr=mij-1;
}
fout<<best;
return 0;
}