Pagini recente » Cod sursa (job #2030832) | Cod sursa (job #869761) | Cod sursa (job #2227702) | Cod sursa (job #1041679) | Cod sursa (job #328632)
Cod sursa(job #328632)
#include<stdio.h>
#include<string.h>
struct queue
{
int x,y;
};
int n,m,p,u,x1,y1,x2,y2;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
char v[1002][1002];
int d[1002][1002];
int mat[1002][1002];
queue q[1000002];
void read()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d\n",&n,&m);
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&v[i][j]);
if(v[i][j]=='I')
{
x1=i;
y1=j;
}
if(v[i][j]=='O')
{
x2=i;
y2=j;
}
if(v[i][j]=='D')
{
q[++u].x=i;
q[u].y=j;
}
if(v[i][j]=='*')
d[i][j]=-1;
}
scanf("\n");
}
for(i=0;i<=n+1;i++)
v[i][0]=v[i][m+1]='*';
for(j=0;j<=m+1;j++)
v[0][j]=v[n+1][j]='*';
}
void rez()
{
int i,cx,cy;
p=1;
while(p<=u)
{
for(i=0;i<=3;i++)
{
cx=q[p].x+dx[i];
cy=q[p].y+dy[i];
if(v[cx][cy]=='.' && d[cx][cy]==0)
{
d[cx][cy]=d[q[p].x][q[p].y]+1;
q[++u].x=cx;
q[u].y=cy;
}
}
p++;
}
d[x2][y2]=n*m;
}
int exista(int dist)
{
memset(mat,0,sizeof(mat));
int i,cx,cy;
p=u=1;
q[1].x=x1;
q[1].y=y1;
while(p<=u)
{
for(i=0;i<=3;i++)
{
cx=q[p].x+dx[i];
cy=q[p].y+dy[i];
if(d[cx][cy]>=dist && mat[cx][cy]==0)
{
mat[cx][cy]=1;
q[++u].x=cx;
q[u].y=cy;
}
}
p++;
}
return mat[x2][y2]==1;
}
void cautare()
{
int st,dr,mij;
st=1;
dr=n*m;
while(st!=dr)
{
mij=(st+dr)>>1;
if(exista(mij)==0)
dr=mij;
else
st=mij+1;
}
while(exista(st))
st++;
while(exista(st)==0)
st--;
printf("%d",st);
}
int main()
{
read();
rez();
cautare();
return 0;
}