Pagini recente » Cod sursa (job #54192) | Cod sursa (job #1344416) | Cod sursa (job #2283691) | Cod sursa (job #2561504) | Cod sursa (job #593433)
Cod sursa(job #593433)
#include<stdio.h>
#include<string.h>
#define LMAX 1<<10
#include<vector>
#include<queue>
using namespace std;
int x[LMAX][LMAX],dx[]={-1,0,1,0},dy[]={0,1,0,-1},min1[LMAX][LMAX];
int n,m,x0,y0,x1,y1;
struct pozdy
{
int x,y;
};
queue<pozdy> Q;
bool ok (int val)
{
int d,mi;
pozdy aux,newaux;
while(!Q.empty())
Q.pop();
memset(min1,0,sizeof(min1));
aux.x=x0; aux.y=y0; min1[x0][y0]=x[x0][y0]; Q.push(aux);
while(!Q.empty())
{
aux=Q.front();
for(d=0;d<=3;d++)
{
newaux.x=aux.x+dx[d];
newaux.y=aux.y+dy[d];
if(x[newaux.x][newaux.y]!=-1 && newaux.x!=0 && newaux.y!=0 && newaux.x<=n && newaux.y<=m)
{
mi=x[newaux.x][newaux.y] < min1[aux.x][aux.y] ? x[newaux.x][newaux.y] : min1[aux.x][aux.y];
if(min1[newaux.x][newaux.y]==0 || mi>min1[newaux.x][newaux.y])
{
min1[newaux.x][newaux.y]=mi;
if(min1[newaux.x][newaux.y]>=val)
Q.push(newaux);
}
}
}
Q.pop();
}
return min1[x1][y1] > 0 ? 1 : 0;
}
int main()
{
int i,j,d,val;
char ch;
pozdy aux,newaux;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&ch);
if(ch=='.')
x[i][j]=-2;
if(ch=='*')
x[i][j]=-1;
if(ch=='D')
{
aux.x=i; aux.y=j;
x[i][j]=0,Q.push(aux);
}
if(ch=='I')
x[i][j]=-2,x0=i,y0=j;
if(ch=='O')
x[i][j]=-2,x1=i,y1=j;
}
scanf("\n");
}
while(!Q.empty())
{
aux=Q.front();
for(d=0;d<=3;d++)
{
newaux.x=aux.x+dx[d];
newaux.y=aux.y+dy[d];
if(x[newaux.x][newaux.y]!=-1 && newaux.x!=0 && newaux.y!=0 && newaux.x<=n && newaux.y<=m)
if(x[newaux.x][newaux.y]==-2 || x[aux.x][aux.y]+1<x[newaux.x][newaux.y])
{
x[newaux.x][newaux.y]=x[aux.x][aux.y]+1;
Q.push(newaux);
}
}
Q.pop();
}
int st=1,dr=n*m,med,last=-1;
while(st<=dr)
{
med=(st+dr)>>1;
if(ok(med))
st=med+1,last=med;
else
dr=med-1;
}
printf("%d",last);
return 0;
}