Pagini recente » Cod sursa (job #1227368) | Cod sursa (job #1408575) | Cod sursa (job #2897146) | Cod sursa (job #2772303) | Cod sursa (job #2120384)
#include <fstream>
#define NM 1000
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int mx,st,dr,mj,a[NM+10][NM+10],l[NM+10][NM+10],t[NM+10][NM+10],m,k,xc,yc,xf,yf,mark,n,ax,ay,ok;
int dx[5]={0,-1,0,1,0};
int dy[5]={0,0,1,0,-1};
struct chestie{
int x,y;
}c[NM*NM+10],p1,p2;
void scan();
void bord();
void dragoni();
bool lee(int nr);
void init();
int main()
{
scan();
bord();
dragoni();
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
fout<<t[i][j]<<' ';
fout<<'\n';
}*/
st=1;dr=NM*NM;mx=-1;
while(st<=dr)
{
mj=(st+dr)/2;
init();
if(lee(mj)==1)
{
ok=lee(mj);
mx=mj;
st=mj+1;
}
else dr=mj-1;
}
fout<<mx<<'\n';
return 0;
}
void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
l[i][j]=0;
}
bool lee(int nr)
{
int ul=1,pr=1;
l[xc][yc]=1;
c[ul].x=xc;
c[ul].y=yc;
if(t[xc][yc]<nr)
return 0;
while(pr<=ul)
{
p1=c[pr];
mark=l[p1.x][p1.y];
pr++;
for(int i=1;i<=4;i++)
{
p2.x=p1.x+dx[i];
p2.y=p1.y+dy[i];
if(a[p2.x][p2.y]==0&&t[p2.x][p2.y]>=nr&&l[p2.x][p2.y]==0)
{
c[++ul]=p2;
l[p2.x][p2.y]=mark+1;
}
}
}
if(l[xf][yf]!=0)
return 1;
return 0;
}
void bord()
{
for(int i=0;i<=n+1;i++)
a[i][0]=a[i][m+1]=1;
for(int j=0;j<=m+1;j++)
a[0][j]=a[n+1][j]=1;
}
void dragoni()
{
int pr=1;
while(pr<=k)
{
p1.x=c[pr].x;p1.y=c[pr].y;
mark=t[p1.x][p1.y];
pr++;
for(int i=1;i<=4;i++)
{
ax=p1.x+dx[i];
ay=p1.y+dy[i];
if(a[ax][ay]==0&&t[ax][ay]==0){
t[ax][ay]=mark+1;
c[++k].x=ax;
c[k].y=ay;
}
}
}
}
void scan()
{
char ch;
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin.get();
for(int j=1;j<=m;j++)
{
fin>>ch;
switch(ch)
{
case '.': a[i][j]=0; break;
case '*': a[i][j]=1; break;
case 'D': c[++k].x=i,c[k].y=j,a[i][j]=1; break;
case 'I': xc=i,yc=j; break;
case 'O': xf=i,yf=j; break;
}
}
}
}