Pagini recente » Cod sursa (job #1316399) | Cod sursa (job #1707840) | Cod sursa (job #2152309) | Cod sursa (job #2766275) | Cod sursa (job #189394)
Cod sursa(job #189394)
#include <stdio.h>
#include <string.h>
#define maxl 1010
int p,q,i,j,k1,k2,n,m,nd,x1,y1,x2,y2,k,l,r,sol;
bool a[maxl][maxl];
int c[maxl][maxl],mat[maxl][maxl];
int d[2][maxl*maxl];
int o[4]={0,0,-1,1};
int v[4]={-1,1,0,0};
char s[maxl];
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d",&n,&m);
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
c[i][j]=maxl*maxl;
nd=0;
for (i=1; i<=n; i++)
{
scanf("%s",s+1);
for (j=1; j<=m; j++)
{
if (s[j]=='D')
{
nd++;
d[0][nd]=i;
d[1][nd]=j;
c[i][j]=0;
}
if (s[j]=='*') a[i][j]=1;
if (s[j]=='I')
{
x1=i;
y1=j;
}
else if (s[j]=='O')
{
x2=i;
y2=j;
}
}
}
p=0;q=nd;
while (p<q)
{
p++;
for (i=0; i<=3; i++)
{
k1=d[0][p]+o[i];
k2=d[1][p]+v[i];
if (k1>0 && k1<=n && k2>0 && k2<=m && c[k1][k2]>c[d[0][p]][d[1][p]]+1 && !a[k1][k2])
{
c[k1][k2]=c[d[0][p]][d[1][p]]+1;
q++;
d[0][q]=k1;
d[1][q]=k2;
}
}
}
p=-1;q=n*m+1;
sol=-1;
while (p+1<q)
{
k=(p+q)/2;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
mat[i][j]=0;
l=0;r=1;
d[0][r]=x1;
d[1][r]=y1;
mat[x1][y1]=1;
while (l<r)
{
l++;
for (i=0; i<=3; i++)
{
k1=d[0][l]+o[i];
k2=d[1][l]+v[i];
if (k1>0 && k1<=n && k2>0 && k2<=m && c[k1][k2]>=k && !a[k1][k2] && mat[k1][k2]==0)
{
r++;
mat[k1][k2]=1;
d[0][r]=k1;
d[1][r]=k2;
}
}
}
if (mat[x2][y2]==1)
{
sol=k;
p=k;
}
else q=k;
}
printf("%d\n",sol);
return 0;
}