Pagini recente » Cod sursa (job #1214973) | Cod sursa (job #2141058) | Cod sursa (job #1312101) | Cod sursa (job #17049) | Cod sursa (job #2133743)
#include <fstream>
using namespace std;
ifstream in ("barbar.in");
ofstream out ("barbar.out");
long long vi[1000003],vj[1000003],v[1002][1002],cv[1002][1002],val[1000003];
int main()
{
long long n,m,i,j,pas=1<<11,a,b,x,y,st=1,dr=0,k=0,ck=0,cdr,ok;
char c;
in>>n>>m>>ws;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
in>>c;
if(c=='D')
{
dr++;
vi[dr]=i;
vj[dr]=j;
}
if(c=='I')
{
a=i;
b=j;
}
if(c=='O')
{
x=i;
y=j;
}
v[i][j]=cv[i][j]=-1;
if(c=='*')
v[i][j]=cv[i][j]=-2;
if(c=='D')
v[i][j]=cv[i][j]=1;
}
st=1;
while(st<=dr)
{
if(v[vi[st]][vj[st]+1]!=-2 && v[vi[st]][vj[st]+1]!=0)
{
if(v[vi[st]][vj[st]+1]==-1 || v[vi[st]][vj[st]+1]>val[st]+1)
{
v[vi[st]][vj[st]+1]=val[st]+1;
dr++;
vi[dr]=vi[st];
vj[dr]=vj[st]+1;
val[dr]=val[st]+1;
}
}
if(v[vi[st]][vj[st]-1]!=-2 && v[vi[st]][vj[st]-1]!=0)
{
if(v[vi[st]][vj[st]-1]==-1 || v[vi[st]][vj[st]-1]>val[st]+1)
{
v[vi[st]][vj[st]-1]=val[st]+1;
dr++;
vi[dr]=vi[st];
vj[dr]=vj[st]-1;
val[dr]=val[st]+1;
}
}
if(v[vi[st]-1][vj[st]]!=-2 && v[vi[st]-1][vj[st]]!=0)
{
if(v[vi[st]-1][vj[st]]==-1 || v[vi[st]-1][vj[st]]>val[st]+1)
{
v[vi[st]-1][vj[st]]=val[st]+1;
dr++;
vi[dr]=vi[st]-1;
vj[dr]=vj[st];
val[dr]=val[st]+1;
}
}
if(v[vi[st]+1][vj[st]]!=-2 && v[vi[st]+1][vj[st]]!=0)
{
if(v[vi[st]+1][vj[st]]==-1 || v[vi[st]+1][vj[st]]>val[st]+1)
{
v[vi[st]+1][vj[st]]=val[st]+1;
dr++;
vi[dr]=vi[st]+1;
vj[dr]=vj[st];
val[dr]=val[st]+1;
}
}
st++;
}
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
cv[i][j]=v[i][j];
while(pas)
{
ck+=pas;
dr=cdr;
st=dr=1;
vi[st]=a;
vj[st]=b;
ok=0;
v[vi[st]][vj[st]]=-2;
while(st<=dr)
{
if(vi[st]==x && vj[st]==y)
ok=1;
if(v[vi[st]][vj[st]+1]!=-2 && v[vi[st]][vj[st]+1]!=0 && v[vi[st]][vj[st]+1]>=ck)
{
v[vi[st]][vj[st]+1]=-2;
dr++;
vi[dr]=vi[st];
vj[dr]=vj[st]+1;
}
if(v[vi[st]][vj[st]-1]!=-2 && v[vi[st]][vj[st]-1]!=0 && v[vi[st]][vj[st]-1]>=ck)
{
v[vi[st]][vj[st]-1]=-2;
dr++;
vi[dr]=vi[st];
vj[dr]=vj[st]-1;
}
if(v[vi[st]-1][vj[st]]!=-2 && v[vi[st]-1][vj[st]]!=0 && v[vi[st]-1][vj[st]]>=ck)
{
v[vi[st]-1][vj[st]]=-2;
dr++;
vi[dr]=vi[st]-1;
vj[dr]=vj[st];
}
if(v[vi[st]+1][vj[st]]!=-2 && v[vi[st]+1][vj[st]]!=0 && v[vi[st]+1][vj[st]]>=ck)
{
v[vi[st]+1][vj[st]]=-2;
dr++;
vi[dr]=vi[st]+1;
vj[dr]=vj[st];
}
st++;
}
if(ok==1)
k=ck;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
v[i][j]=cv[i][j];
pas/=2;
ck=k;
}
if(k)
out<<k;
else
out<<-1;
return 0;
}