Pagini recente » Cod sursa (job #2595506) | Cod sursa (job #1812712) | Cod sursa (job #2351039) | Cod sursa (job #1610267) | Cod sursa (job #906316)
Cod sursa(job #906316)
#include<stdio.h>
#define nmax 1005
#define inf nmax*nmax
struct element{long l,c;};
long n, m, i, st, dr, mjc, nv, l1, l2, c1, c2, j, inc, sf, k, lac, cac;
long ma[nmax][nmax], viz[nmax][nmax];
element co[nmax*nmax], el;
bool ok;
char s[nmax];
long vl[5]={0,-1,0,0,1};
long vc[5]={0,0,-1,1,0};
void citire()
{
scanf("%ld %ld",&n,&m);
gets(s);
for (i=1;i<=n;i++)
{
gets(s);
for (j=1;j<=m;j++)
{
if (s[j-1]=='.')
ma[i][j]=inf;
if (s[j-1]=='*')
ma[i][j]=-1;
if (s[j-1]=='D')
{
co[++sf].l=i; co[sf].c=j;
ma[i][j]=0;
}
if (s[j-1]=='I')
{ l1=i; c1=j; ma[i][j]=inf; }
if (s[j-1]=='O')
{ l2=i; c2=j; ma[i][j]=inf; }
}
}
}
void bordare()
{
for (j=0;j<=m+1;j++)
ma[0][j]=ma[n+1][j]=-1;
for (i=0;i<=n+1;i++)
ma[i][0]=ma[i][m+1]=-1;
}
void calculare()
{
inc=1;
while (inc<=sf)
{
el=co[inc]; inc++;
for (k=1;k<=4;k++)
{
lac=el.l+vl[k]; cac=el.c+vc[k];
if (ma[lac][cac]==inf)
{
co[++sf].l=lac; co[sf].c=cac;
ma[lac][cac]=ma[el.l][el.c]+1;
}
}
}
}
void verificare()
{
nv++;
inc=sf=1;
co[1].l=l1; co[1].c=c1; viz[l1][c1]=nv;
while (inc<=sf)
{
el=co[inc]; inc++;
for (k=1;k<=4;k++)
{
lac=el.l+vl[k]; cac=el.c+vc[k];
if ((ma[lac][cac]>=mjc)&&(viz[lac][cac]<nv))
{
co[++sf].l=lac; co[sf].c=cac;
viz[lac][cac]=nv;
if ((lac==l2)&&(cac==c2))
{ inc=sf+5; break; }
}
}
}
ok=(viz[l2][c2]==nv);
}
void rezolvare()
{
st=1; dr=ma[l1][c1];
while (st<=dr)
{
mjc=(st+dr)/2;
verificare();
if (ok)
st=mjc+1;
else
dr=mjc-1;
}
if (dr==0)
printf("-1\n");
else
printf("%ld\n",dr);
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
citire();
calculare();
bordare();
rezolvare();
return 0;
}