Pagini recente » Cod sursa (job #1117878) | Cod sursa (job #242946) | Cod sursa (job #2973871) | Cod sursa (job #285192) | Cod sursa (job #1053155)
#include<stdio.h>
int a[1003][1003],n,m,pi,pf,ppi,ppf;
int b[1003][1003];
const int dx[]={0,-1,0,1},
dy[]={-1,0,1,0};
int min(int a, int b)
{
return (a<b)? (a) : (b);
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
char c;
scanf("%d %d",&n,&m);
int x[1010000],y[1010000];
long lf=0;
for(int i=1;i<=n;i++)
{c=fgetc(stdin);
for(int j=1;j<=m;j++)
{c=fgetc(stdin);
if(c=='.') a[i][j]=0;
else if(c=='I') {ppi=i;ppf=j;a[i][j]=0;}
else if(c=='D') {a[i][j]=0;x[++lf]=i;y[lf]=j;}
else if(c=='*') {a[i][j]=-1;}
else if(c=='O'){pi=i;pf=j;a[i][j]=0;}
}
}
int j,_i,_j,v=lf,i;
int ok=0,nr=0;
while(ok==0)
{ok=1;nr=0;
for(long li=1;li<=lf;li++)
{
i=x[li];
j=y[li];
for(int k=0;k<4;k++)
{ _i=i+dx[k];
_j=j+dy[k];
if(_i<1||_i>n) continue;
if(_j<1||_j>m) continue;
if(a[_i][_j]<0||a[_i][_j]>0) continue;
{if(lf<999900)
{ok=1;
x[++lf]=_i;
y[lf]=_j;
a[_i][_j]=a[i][j]+1;
}
else {ok=0;
nr++;
x[nr]=_i;
y[nr]=_j;
a[_i][_j]=a[i][j]+1;
}
}
}
if(li<=v) a[i][j]=-1;
}
lf=nr;
}
lf=1;
x[1]=ppi;
y[1]=ppf;b[ppi][ppf]=a[ppi][ppf];
ok=0;
while(ok==0)
{ok=1;nr=0;
for(int li=1;li<=lf;li++)
{
i=x[li];
j=y[li];
for(int k=0;k<4;k++)
{_i=i+dx[k];
_j=j+dy[k];
if(_i<1||i>n) continue;
if(_j<1||j>m) continue;
if(a[_i][_j]==-1) continue;
{if(lf<999900)
{
if(b[_i][_j] == 0)
{
b[_i][_j] = min(a[_i][_j], b[i][j]);
lf++;
x[lf]=_i;
y[lf]=_j;
continue;
}
if(b[i][j] > b[_i][_j] && b[_i][_j] < a[_i][_j])
{
b[_i][_j] = min(b[i][j],a[_i][_j]);
lf++;
x[lf]=_i;
y[lf]=_j;
}
ok=1;
}
else
{
if(b[_i][_j] == 0)
{
b[_i][_j] = min(a[_i][_j], b[i][j]);
nr++;
x[nr]=_i;
y[nr]=_j;
continue;
}
if(b[i][j] > b[_i][_j] && b[_i][_j] < a[_i][_j])
{
b[_i][_j] = min(b[i][j],a[_i][_j]);
nr++;
x[nr]=_i;
y[nr]=_j;
}
ok=0;
}
}
}
}
lf=nr;
}
if(b[pi][pf]!=0) printf("%d\n",b[pi][pf]);
else printf("-1\n");
return 0;
}