Pagini recente » Cod sursa (job #1008704) | Cod sursa (job #2588038) | Cod sursa (job #2449908) | Cod sursa (job #1904212) | Cod sursa (job #186203)
Cod sursa(job #186203)
#include <stdio.h>
#define SI 1000000
#define Nmax 1011
int b[Nmax][Nmax],a[Nmax][Nmax];
struct punct{int c1,c2;};
punct plec,sos;
short int va1[Nmax*Nmax];
short int vb1[Nmax*Nmax];
short int va2[Nmax*Nmax];
short int vb2[Nmax*Nmax];
int nrv1,nrv2;
const int lin[]={0,1,0,-1};
const int col[]={1,0,-1,0};
int rez,R,C;
inline int minim(int xx,int yy)
{
if(xx<yy)
return xx;
return yy;
}
void read()
{
char ch;
freopen("barbar.in", "r",stdin);
freopen("barbar.out", "w",stdout);
scanf("%d%d", &R,&C);
for(int i=1;i<=R;++i)
{
scanf("%c", &ch);
for(int j=1;j<=C;++j)
{
scanf("%c", &ch);
if(ch=='I')
{
a[i][j]=SI;
plec.c1=i;
plec.c2=j;
}
if(ch=='O')
{
a[i][j]=SI;
sos.c1=i;
sos.c2=j;
}
if(ch=='.')
a[i][j]=SI;
if(ch=='*')
a[i][j]=-2;
if(ch=='D')
{
a[i][j]=0;
va1[++nrv1]=i;
vb1[nrv1]=j;
}
}
}
}
/*void lee2(int x,int y)
{
for(int t=0;t<4;t++)
if(b[x+lin[t]][y+col[t]]<b[x][y])
{
b[x+lin[t]][y+col[t]]=minim(a[x+lin[t]][y+col[t]],b[x][y]);
va[++nrv]=x+lin[t];
vb[nrv]=y+col[t];
}
}*/
void make_lee()
{
int x,y;
for(int nr=1;;++nr)
{
if(nr%2)
{
nrv2=0;
for(int i=1;i<=nrv1;i++)
{
x=va1[i];
y=vb1[i];
for(int t=0;t<4;t++)
if(a[x+lin[t]][y+col[t]]>a[x][y]+1)
{
a[x+lin[t]][y+col[t]]=a[x][y]+1;
va2[++nrv2]=x+lin[t];
vb2[nrv2]=y+col[t];
}
}
}
else
{
nrv1=0;
for(int i=1;i<=nrv2;i++)
{
for(int t=0;t<4;t++)
if((a[va2[i]+lin[t]][vb2[i]+col[t]]>a[va2[i]][vb2[i]]+1))
{
a[va2[i]+lin[t]][vb2[i]+col[t]]=a[va2[i]][vb2[i]]+1;
va1[++nrv1]=va2[i]+lin[t];
vb1[nrv1]=vb2[i]+col[t];
}
}
nrv2=0;
}
if(!nrv1 && !nrv2)
break;
}
//printf("%d\n",nrv);
for(int i=1;i<=R;++i)
for(int j=1;j<=C;++j)
b[i][j]=-1;
b[plec.c1][plec.c2]=a[plec.c1][plec.c2];
va1[1]=plec.c1;
vb1[1]=plec.c2;
nrv1=1;
for(int nr=1;;++nr)
{
if(nr%2)
{
nrv2=0;
for(int i=1;i<=nrv1;i++)
{
x=va1[i];
y=vb1[i];
for(int t=0;t<4;t++)
if(b[x+lin[t]][y+col[t]]<b[x][y])
{
b[x+lin[t]][y+col[t]]=minim(a[x+lin[t]][y+col[t]],b[x][y]);
va2[++nrv2]=va1[i]+lin[t];
vb2[nrv2]=vb1[i]+col[t];
}
}
}
else
{
nrv1=0;
for(int i=1;i<=nrv2;i++)
{
x=va2[i];
y=vb2[i];
for(int t=0;t<4;t++)
if(b[x+lin[t]][y+col[t]]<b[x][y])
{
b[x+lin[t]][y+col[t]]=minim(a[x+lin[t]][y+col[t]],b[x][y]);
va1[++nrv1]=va2[i]+lin[t];
vb1[nrv1]=vb2[i]+col[t];
}
}
}
if(!nrv1 && !nrv2)
break;
}
rez=b[sos.c1][sos.c2];
}
void print()
{
//printf("%d %d %d %d\n",plec.c1,plec.c2,sos.c1,sos.c2);
/*for(int i=1;i<=R;++i)
{
for(int j=1;j<=C;++j)
printf("%d ",a[i][j]);
printf("\n");
}*/
//printf("\n");
/*for(int i=1;i<=R;++i)
{
for(int j=1;j<=C;++j)
printf("%d ",b[i][j]);
printf("\n");
}*/
printf("%d\n",rez);
}
int main()
{
read();
make_lee();
print();
return 0;
}