Pagini recente » Cod sursa (job #3365947) | Cod sursa (job #3365990) | Cod sursa (job #3365946) | Cod sursa (job #3365943) | Cod sursa (job #3365793)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int r, c;
char a[1005][1005];
int dd[1005][1005];
bool v[1005][1005];
int X, Y, eX, eY;
int di[]={-1, 0, 1, 0};
int dj[]={0, 1, 0, -1};
bool vf(int k)
{
if(dd[X][Y]<k || dd[eX][eY]<k)
return 0;
for(int i=1; i<=r; i++)
for(int j=1; j<=c; j++)
v[i][j]=0;
queue<pair<int, int>>q;
q.push({X, Y});
v[X][Y]=1;
while(!q.empty())
{
int x=q.front().first;
int y=q.front().second;
q.pop();
if(x==eX && y==eY)
return 1;
for(int p=0; p<4; p++)
{
int vx=x+di[p];
int vy=y+dj[p];
if (vx>=1 && vx<=r && vy>=1 && vy<=c)
{
if (!v[vx][vy] && a[vx][vy]!='*' && dd[vx][vy]>=k)
{
v[vx][vy]=1;
q.push({vx, vy});
}
}
}
}
return 0;
}
int main()
{
fin>>r>>c;
queue<pair<int, int>>qq;
for (int i=1; i<=r; i++)
{
string l;
fin>>l;
for(int j=1; j<=c; j++)
{
a[i][j]=l[j-1];
dd[i][j]=-1;
if(a[i][j]=='D')
{
dd[i][j]=0;
qq.push({i, j});
}
else if(a[i][j]=='I')
{
X=i;
Y=j;
}
else if(a[i][j]=='O')
{
eX=i;
eY=j;
}
}
}
while(!qq.empty())
{
int x=qq.front().first;
int y=qq.front().second;
qq.pop();
for(int p=0; p<4; p++)
{
int vx=x+di[p];
int vy=y+dj[p];
if (vx>=1 && vx<=r && vy>=1 && vy<=c)
{
if (a[vx][vy]!='*' && dd[vx][vy]==-1)
{
dd[vx][vy]=dd[x][y]+1;
qq.push({vx, vy});
}
}
}
}
int st=0, dr=r+c, d=-1;
while (st<=dr)
{
int mij=(st+dr)/2;
if (vf(mij))
{
d=mij;
st=mij+1;
}
else
{
dr=mij-1;
}
}
fout<<d;
return 0;
}