Pagini recente » Cod sursa (job #727455) | Cod sursa (job #346454) | Cod sursa (job #1423422) | Cod sursa (job #2546465) | Cod sursa (job #2508379)
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m,i,j;
char c;
int dist[1002][1002], dmax;
int a[1002][1002];
int viz[1002][1002];
int li,ci, lo,co;
int x,y, xx,yy;
int dx[4]={1, -1, 0, 0};
int dy[4]={0, 0, 1, -1};
queue < pair <int, int> > dragoni;
queue < pair <int, int> > drum;
bool inauntru(int x, int y)
{
return (x>=1 && x<=n && y>=1 && y<=n);
}
bool drum_posibil(int L, int nr)
{
int x,y,i;
a[li][ci]=1;
viz[li][ci]=nr;
drum.push(make_pair(li,ci));
while (!drum.empty() && viz[lo][co]!=nr)
{
x=drum.front().first;
y=drum.front().second;
drum.pop();
for (i=0;i<4;i++)
{
xx=x+dx[i];
yy=y+dy[i];
if (viz[xx][yy]!=nr && dist[xx][yy]>=L && inauntru(xx, yy))
{
a[xx][yy]=a[x][y]+1;
viz[xx][yy]=nr;
drum.push(make_pair(xx, yy));
}
}
}
while (!drum.empty())
drum.pop();
return (viz[lo][co]==nr);
}
int main()
{
f>>n>>m;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
f>>c;
if (c=='I')
{
li=i;
ci=j;
}
else if (c=='O')
{
lo=i;
co=j;
}
else if (c=='*')
{
a[i][j]=-1;
}
else if (c=='D')
{
dragoni.push(make_pair(i,j));
a[i][j]=-1;
}
}
while (!dragoni.empty())
{
x=dragoni.front().first;
y=dragoni.front().second;
dragoni.pop();
for (i=0;i<4;i++)
{
xx=x+dx[i];
yy=y+dy[i];
if (dist[xx][yy]==0 && a[xx][yy]==0 && inauntru(xx, yy))
{
dist[xx][yy]=dist[x][y]+1;
dmax=max(dmax, dist[xx][yy]);
dragoni.push(make_pair(xx, yy));
}
}
}
int st=1, dr=dmax, mij, rez=-1, nr=0;
while (st<=dr)
{
nr++;
mij=(st+dr)/2;
if (drum_posibil(mij, nr))
{
rez=mij;
st=mij+1;
}
else
dr=mij-1;
}
g<<rez;
return 0;
}