Pagini recente » Cod sursa (job #380331) | Cod sursa (job #1265170) | Cod sursa (job #1305595) | Cod sursa (job #694332) | Cod sursa (job #325567)
Cod sursa(job #325567)
#include <stdio.h>
#define N 1005
#define inf 5000000
int m,n,r,crd1,crd2,crd3,crd4,rez,sol[5],solutie;
int v[N][N],mat[N][N];
int dlin[]={0,0,-1,1};
int dcol[]={1,-1,0,0};
char marc[N][N];
struct coord
{
int a,b;
};
coord dragon[N];
struct bfs
{
int a,b,cost;
};
bfs coada[N*N];
void read()
{
char x;
scanf("%d%d\n",&m,&n);
int lin=1,col=0;
while (scanf("%c",&x)!=EOF)
{
if (x=='\n')
{
lin++;
col=0;
continue;
}
if (x=='.')
{
v[lin][++col]=0;
continue;
}
if (x=='I')
{
v[lin][++col]=0;
crd1=lin;
crd2=col;
continue;
}
if (x=='O')
{
v[lin][++col]=0;
crd3=lin;
crd4=col;
continue;
}
if (x=='D')
{
v[lin][++col]=0;
dragon[++r].a=lin;
dragon[r].b=col;
continue;
}
if (x=='*')
{
v[lin][++col]=1;
marc[lin][col]=1;
continue;
}
}
}
void bordare()
{
int i;
for (i=0; i<=n+1; i++)
{
marc[0][i]=1;
marc[m+1][i]=1;
}
for (i=0; i<=m+1; i++)
{
marc[i][0]=1;
marc[i][n+1]=1;
}
}
void bfs1()
{
int i,j,ok=1,ant=0,act;
bordare();
for (i=1; i<=r; i++)
{
coada[i].a=dragon[i].a;
coada[i].b=dragon[i].b;
coada[i].cost=0;
marc[coada[i].a][coada[i].b]=1;
}
while (ok)
{
ok=0;
act=r;
for (i=ant+1; i<=act; i++)
for (j=0; j<4; j++)
{
if (v[coada[i].a+dlin[j]][coada[i].b+dcol[j]]==0 && marc[coada[i].a+dlin[j]][coada[i].b+dcol[j]]==0)
{
coada[++r].a=coada[i].a+dlin[j];
coada[r].b=coada[i].b+dcol[j];
coada[r].cost=coada[i].cost+1;
marc[coada[r].a][coada[r].b]=1;
mat[coada[r].a][coada[r].b]=r;
ok=1;
}
}
ant=act;
}
}
void precalculation()
{
int i,j;
for (i=1; i<=m; i++)
for (j=1; j<=n; j++)
{
if (v[i][j]==1)
{
mat[i][j]=-1;
continue;
}
if (marc[i][j]==0)
{
mat[i][j]=-1;
continue;
}
mat[i][j]=coada[mat[i][j]].cost;
}
}
void bordare2()
{
int i,j;
for (i=0; i<=N; i++)
for (j=0; j<=N; j++)
marc[i][j]=0;
for (i=1; i<=m; i++)
for (j=1; j<=n; j++)
if (v[i][j]==1)
marc[i][j]=1;
for (i=0; i<=n+1; i++)
{
marc[0][i]=1;
marc[m+1][i]=1;
}
for (i=0; i<=m+1; i++)
{
marc[i][0]=1;
marc[i][n+1]=1;
}
}
void walking()
{
bordare2();
rez=inf;
r=0;
int i,j,fin=1,best,caz,ant=0,act;
coada[++r].a=crd1;
coada[r].b=crd2;
marc[crd1][crd2]=1;
while (fin)
{
fin=0;
act=r;
for (i=ant+1; i<=act; i++)
{
best=-2;
sol[0]=0;
for (j=0; j<4; j++)
{
if (marc[coada[i].a+dlin[j]][coada[i].b+dcol[j]]==0 && coada[i].a+dlin[j]==crd3 && coada[i].b+dcol[j]==crd4)
{
if (mat[coada[i].a+dlin[j]][coada[i].b+dcol[j]]<rez)
rez=mat[coada[i].a+dlin[j]][coada[i].b+dcol[j]];
solutie=1;
return;
}
if (marc[coada[i].a+dlin[j]][coada[i].b+dcol[j]]==0 && mat[coada[i].a+dlin[j]][coada[i].b+dcol[j]]==best)
sol[++sol[0]]=j;
if (marc[coada[i].a+dlin[j]][coada[i].b+dcol[j]]==0 && mat[coada[i].a+dlin[j]][coada[i].b+dcol[j]]>best)
{
sol[0]=0;
sol[++sol[0]]=j;
}
}
for (j=1; j<=sol[0]; j++)
{
coada[++r].a=coada[i].a+dlin[sol[j]];
coada[r].b=coada[i].b+dcol[sol[j]];
marc[coada[r].a][coada[r].b]=1;
if (mat[coada[r].a][coada[r].b]<rez)
rez=mat[coada[r].a][coada[r].b];
fin=1;
}
}
ant=act;
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
read();
bfs1();
precalculation();
walking();
if (solutie==0)
printf("-1\n");
else
printf("%d\n",rez);
return 0;
}