Pagini recente » Cod sursa (job #1609142) | Cod sursa (job #2224986) | Cod sursa (job #1564847) | Rating Radu Stefan (raduteica) | Cod sursa (job #334354)
Cod sursa(job #334354)
#include <stdio.h>
#define N 1005
#define inf 5000000
int m,n,r,crd1,crd2,crd3,crd4;
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];
int min[N][N],bani[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,j;
for (i=0; i<=m+1; i++)
for (j=0; j<=n+1; j++)
marc[i][j]=0;
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;
}
}
char bfs_find(int x)
{
r=0;
bordare();
if (mat[crd1][crd2]<x)
return 0;
coada[++r].a=crd1;
coada[r].b=crd2;
int i,j,ok=1,ant=0,act,temp1,temp2;
while (ok)
{
ok=0;
act=r;
for (i=ant+1; i<=act; i++)
for (j=0; j<4; j++)
{
temp1=coada[i].a+dlin[j];
temp2=coada[i].b+dcol[j];
if (mat[temp1][temp2]>=x && marc[temp1][temp2]==0)
{
coada[++r].a=temp1;
coada[r].b=temp2;
marc[temp1][temp2]=1;
ok=1;
}
}
ant=act;
}
if (marc[crd3][crd4])
return 1;
return 0;
}
void cbin()
{
int st=0,dr=m*n,m;
while (st!=dr)
{
m=(st+dr+1)/2;
if (bfs_find(m))
st=m;
else
dr=m-1;
}
if (bfs_find(st))
printf("%d\n",st);
else
printf("-1\n");
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
read();
bfs1();
precalculation();
cbin();
return 0;
}