Pagini recente » Cod sursa (job #754376) | Cod sursa (job #825031) | Cod sursa (job #2969200) | Cod sursa (job #574352) | Cod sursa (job #1953968)
#include <iostream>
#include <fstream>
#define intx dragoni[b].x
#define inty dragoni[b].y
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int a[1003][1003],n,m,lt,rt,md,dir_l[4]={0,1,0,-1},dir_c[4]={1,0,-1,0},d;
struct {
int x,y;
}dragoni[1000003],in,out,v[1000003];
char c;
int h,o,k,b;
bool valid()
{
if(h>0 && o>0 && h<=n && o<=m) return 1;
return 0;
}
void init()
{
k=d;
b=1;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(a[i][j]>0) a[i][j]=0;
}
}
while(b<=k && a[intx][inty]<md-1)
{
for(int i=0;i<=3;++i)
{
h=intx+dir_l[i]; o=inty+dir_c[i];
if(valid() && a[h][o]==0)
{
a[h][o]=max(a[intx][inty],0)+1;
++k;
dragoni[k].x=h;
dragoni[k].y=o;
}
}
++b;
}
}
int main()
{
f>>n>>m;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
f>>c;
if(c=='D') ++k, dragoni[k].x=i, dragoni[k].y=j, a[i][j]=-2;
else if(c=='*') a[i][j]=-1;
else if(c=='I') in.x=i, in.y=j, v[1].x=i, v[1].y=j;
else if(c=='O') out.x=i, out.y=j;
}
}
d=k;
rt=2000;
while(rt-lt!=1)
{
md=(lt+rt)/2;
init();
k=1;
b=1;
if(a[v[1].x][v[1].y]!=0 || a[out.x][out.y]!=0) rt=md;
else {
while(b<=k && (v[b].x!=out.x || v[b].y!=out.y))
{
for(int i=0;i<=3;++i)
{
h=v[b].x+dir_l[i]; o=v[b].y+dir_c[i];
if(valid() && a[h][o]==0)
{
a[h][o]=1;
++k;
v[k].x=h;
v[k].y=o;
}
}
++b;
}
if(v[b].x==out.x && v[b].y==out.y) lt=md;
else rt=md; }
}
if(lt==0) {
md=0;
for(int i=1;i<=d;++i)
{
a[dragoni[i].x][dragoni[i].y]=0;
}
init();
k=1;
b=1;
while(b<=k && (v[b].x!=out.x || v[b].y!=out.y))
{
for(int i=0;i<=3;++i)
{
h=v[b].x+dir_l[i]; o=v[b].y+dir_c[i];
if(valid() && a[h][o]==0)
{
a[h][o]=1;
++k;
v[k].x=h;
v[k].y=o;
}
}
++b;
}
if(v[b].x==out.x && v[b].y==out.y) lt=0;
else lt=-1; }
g<<lt;
return 0;
}