Pagini recente » Cod sursa (job #115321) | Cod sursa (job #2920856) | Cod sursa (job #2865941) | Cod sursa (job #2326971) | Cod sursa (job #578325)
Cod sursa(job #578325)
#include<stdio.h>
#include<string.h>
struct date
{
short i;
short j;
};
char cc;
long ifi,jfi,is,js,x,n,m,max,i,j,a[2001][2001],c[2001][2001];
date b[10010000];
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%ld %ld\n",&n,&max);
for(i=1;i<=n;i++)
{
for(j=1;j<=max;j++)
{
scanf("%c",&cc);
if(cc=='*') a[i][j]=-1;
if(cc=='D')
{
m++;
b[m].i=i;
b[m].j=j;
}
else if(cc=='I')
{
is=i;
js=j;
}
else if(cc=='O')
{
ifi=i;
jfi=j;
}
}
scanf("\n");
}
x=1;
for(i=0;i<=n;i++)
{
a[i][0]=-1;
a[i][n+1]=-1;
}
for(i=0;i<=max;i++)
{
a[0][i]=-1;
a[max+1][i]=-1;
}
while(x<=m)
{
if(a[b[x].i+1][b[x].j]==0)
{
m++;
b[m].i=b[x].i+1;
b[m].j=b[x].j;
a[b[m].i][b[m].j]=1+a[b[x].i][b[x].j];
}
if(a[b[x].i-1][b[x].j]==0)
{
m++;
b[m].i=b[x].i-1;
b[m].j=b[x].j;
a[b[m].i][b[m].j]=1+a[b[x].i][b[x].j];
}
if(a[b[x].i][b[x].j+1]==0)
{
m++;
b[m].i=b[x].i;
b[m].j=b[x].j+1;
a[b[m].i][b[m].j]=1+a[b[x].i][b[x].j];
}
if(a[b[x].i][b[x].j-1]==0)
{
m++;
b[m].i=b[x].i;
b[m].j=b[x].j-1;
a[b[m].i][b[m].j]=1+a[b[x].i][b[x].j];
}
x++;
}
memset(b,0,sizeof(b));
x=1;
b[x].i=is;
b[x].j=js;
m=1;
c[b[x].i][b[x].j]=a[b[x].i][b[x].j];
while(x<=m)
{
if(a[b[x].i+1][b[x].j]!=-1 && c[b[x].i+1][b[x].j]<c[b[x].i][b[x].j])
{
m++;
if(c[b[x].i][b[x].j]<a[b[x].i+1][b[x].j])
c[b[x].i+1][b[x].j]=c[b[x].i][b[x].j];
else c[b[x].i+1][b[x].j]=a[b[x].i+1][b[x].j];
b[m].i=b[x].i+1;
b[m].j=b[x].j;
}
if(a[b[x].i-1][b[x].j]!=-1 && c[b[x].i-1][b[x].j]<c[b[x].i][b[x].j])
{
m++;
if(c[b[x].i][b[x].j]<a[b[x].i-1][b[x].j])
c[b[x].i-1][b[x].j]=c[b[x].i][b[x].j];
else c[b[x].i-1][b[x].j]=a[b[x].i-1][b[x].j];
b[m].i=b[x].i-1;
b[m].j=b[x].j;
}
if(a[b[x].i][b[x].j+1]!=-1 && c[b[x].i][b[x].j+1]<c[b[x].i][b[x].j])
{
m++;
if(c[b[x].i][b[x].j]<a[b[x].i][b[x].j+1])
c[b[x].i][b[x].j+1]=c[b[x].i][b[x].j];
else c[b[x].i][b[x].j+1]=a[b[x].i][b[x].j+1];
b[m].i=b[x].i;
b[m].j=b[x].j+1;
}
if(a[b[x].i][b[x].j-1]!=-1 && c[b[x].i][b[x].j-1]<c[b[x].i][b[x].j])
{
m++;
if(c[b[x].i][b[x].j]<a[b[x].i][b[x].j-1])
c[b[x].i][b[x].j-1]=c[b[x].i][b[x].j];
else c[b[x].i][b[x].j-1]=a[b[x].i][b[x].j-1];
b[m].i=b[x].i;
b[m].j=b[x].j-1;
}
x++;
}
if(c[ifi][jfi]==0)
{
printf("-1\n");
return 0;
}
printf("%ld\n",c[ifi][jfi]);
return 0;
}