Pagini recente » Cod sursa (job #2685377) | Cod sursa (job #2381152) | Cod sursa (job #2684398) | Cod sursa (job #3284765) | Cod sursa (job #1223667)
//horatiu11
# include <cstdio>
# include <queue>
# include <algorithm>
# include <cstring>
# define nmax 1003
# define inf 2000000000
using namespace std;
int a[nmax][nmax],d[nmax][nmax],n,m,li,ci,lf,cf,M,l,r;
bool matrix[nmax][nmax];
char ch;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
struct cel{int l,c;}x,y;
queue <cel>q;
inline void lee()
{
int i,lv,cv;
while(!q.empty())
{
x=q.front();q.pop();
for(i=0;i<4;++i)
{
lv=x.l+dx[i];cv=x.c+dy[i];
if(a[lv][cv]!=-1 && d[lv][cv]>d[x.l][x.c]+1 && lv>0 && lv<=n && cv>0 && cv<=m)
{
d[lv][cv]=d[x.l][x.c]+1;
M=max(M,d[lv][cv]);
y.l=lv;y.c=cv;q.push(y);
}
}
}
}
inline bool verif(int val)
{
int i,lv,cv;
if(d[li][ci]<val)return false;
memset(matrix,false,sizeof(matrix));
matrix[li][ci]=true;
x.l=li;x.c=ci;q.push(x);
while(!q.empty())
{
x=q.front();q.pop();
for(i=0;i<4;++i)
{
lv=x.l+dx[i];cv=x.c+dy[i];
if(d[lv][cv]>=val && a[lv][cv]!=-1 && !matrix[lv][cv] && lv>0 && lv<=n && cv>0 && cv<=m)
{
matrix[lv][cv]=true;
y.l=lv;y.c=cv;
q.push(y);
}
}
}
return matrix[lf][cf];
}
int main()
{
int i,j,mij;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d%c",&n,&m,&ch);
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
d[i][j]=inf;
scanf("%c",&ch);
if(ch=='I')li=i,ci=j,a[i][j]=2;
else if(ch=='O')lf=i,cf=j,a[i][j]=3;
else if(ch=='*')a[i][j]=-1;
else if(ch=='D')
{
a[i][j]=1;
d[i][j]=0;
x.l=i;x.c=j;
q.push(x);
}
}
scanf("%c",&ch);
}
lee();
l=0;r=M;
while(l<=r)
{
mij=(l+r)/2;
if(verif(mij)==true)l=mij+1;
else r=mij-1;
}
if(r>M || r<0)printf("-1\n");
else printf("%d\n",r);
return 0;
}