Pagini recente » Cod sursa (job #2384535) | Cod sursa (job #878285) | Cod sursa (job #2736202) | Cod sursa (job #1084566) | Cod sursa (job #1133687)
#include <cstdio>
#include <queue>
#include <cstring>
const int Q=1002;
int v[Q][Q];
int l,c;
int sx,sy,fx,fy;
std::queue<int> a,b;
int dx[]={0,1,0,-1,0};
int dy[]={0,0,1,0,-1};
int max;
bool trec[Q][Q];
void clean()
{
for(int i=1; i<=l; i++)
memset(trec[i],0,sizeof trec[i]);
}
bool drum(int dist)
{
a.push(sx);
b.push(sy);
int size,kx,ky,pas=0;
while(a.size()!=0)
{
size=a.size();
for(int i=1; i<=size; i++)
{
kx=a.front();
ky=b.front();
a.pop();
b.pop();
for(int k=1; k<=4; k++)
{
if(v[kx+dx[k]][ky+dy[k]]>=dist && trec[kx+dx[k]][ky+dy[k]]==0 )
{
trec[kx+dx[k]][ky+dy[k]]=1;
a.push(kx+dx[k]);
b.push(ky+dy[k]);
if(kx+dx[k]==fx && ky+dy[k]==fy)
{
while(a.size())
{
a.pop();
b.pop();
}
return 0;
}
}
}
}
}
return 1;
}
int minim(int q, int w)
{
if(q<w)
return q;
return w;
}
void make_dragon(int x, int y)
{
a.push(x);
b.push(y);
int size,kx,ky,pas=0;
while(a.size()!=0)
{
size=a.size();
pas++;
for(int i=1; i<=size; i++)
{
kx=a.front();
ky=b.front();
a.pop();
b.pop();
for(int k=1; k<=4; k++)
{
if(v[kx+dx[k]][ky+dy[k]]>pas || v[kx+dx[k]][ky+dy[k]]==0 && v[kx+dx[k]][ky+dy[k]]!=-1)
{
v[kx+dx[k]] [ky+dy[k]]=pas;
a.push(kx+dx[k]);
b.push(ky+dy[k]);
}
}
}
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d\n",&l,&c);
char h;
for(int i=1; i<=l; i++)
{
v[i][0]=-1;
v[i][c+1]=-1;
}
for(int j=1; j<=c; j++)
{
v[0][j]=-1;
v[l+1][j]=-1;
}
for(int i=1; i<=l; i++)
{
for(int j=1; j<=c; j++)
{
scanf("%c",&h);
if(h=='I')
{
sx=i;
sy=j;
}
if(h=='O')
{
fx=i;
fy=j;
}
if(h=='D')
{
make_dragon(i,j);
}
if(h=='*')
{
v[i][j]=-1;
}
}
scanf("\n");
}
/*
for(int i=0; i<=l+1; i++)
{
for(int j=0; j<=c+1; j++)
printf("%d\t",v[i][j]);
printf("\n");
}
*/
int pas=1<<11,t=0;
while(pas)
{
if(drum(pas+t)==0)
{
t=pas;
}
clean();
pas/=2;
}
int i;
if(t==0 && drum(0)==1)
t=-1;
printf("%d",t);
return 0;
}