Pagini recente » Cod sursa (job #2849464) | Cod sursa (job #2861876) | Cod sursa (job #2280561) | Cod sursa (job #447480) | Cod sursa (job #196366)
Cod sursa(job #196366)
#include<stdio.h>
int a[1001][1001],n,m,pi,pf,ppi,ppf;
int b[1001][1001];
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[1000001],y[1000001];
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 {pi=i;pf=j;a[i][j]=0;}
}
}
int j,_i,i,_j,v=lf;
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] == -1)
{
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] == -1)
{
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;
}
printf("%d\n",b[pi][pf]);
return 0;
}