Pagini recente » Cod sursa (job #560319) | Cod sursa (job #1980457) | Cod sursa (job #2578423) | Cod sursa (job #826209) | Cod sursa (job #414641)
Cod sursa(job #414641)
#include<cstdio>
int sf,m,n,pf1,pf2,px[1002][1002],p[1002][1002],dl[1002],dc[1002];
char a[1002][1002];
struct point
{
int lz,cz;
};
point cc[1<<20];
int max(int x,int y)
{
if(x>y)
return x;
return y;
}
int l1()
{
int i,j,nr=0;
point x,y;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(a[i][j]=='D')
{
cc[nr].lz=i;
cc[nr].cz=j;
nr++;
}
for(i=0;i<nr;i++)
{
x.lz=cc[i].lz;
x.cz=cc[i].cz;
dl[0]=1;
dl[1]=0;
dl[2]=-1;
dl[3]=0;
dc[0]=0;
dc[1]=1;
dc[2]=0;
dc[3]=-1;
for(j=0;j<4;j++)
if(p[x.lz+dl[j]][x.cz+dc[j]]==0 && a[x.lz+dl[j]][x.cz+dc[j]]!='*' && a[x.lz+dl[j]][x.cz+dc[j]]!='D')
{
y.lz=x.lz+dl[j];
y.cz=x.cz+dc[j];
p[y.lz][y.cz]=p[x.lz][x.cz]+1;
cc[nr]=y;
nr++;
}
}
return 0;
}
int l2(int nub)
{
int i,j,nr=0;
point x,y;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(a[i][j]=='I')
{
cc[nr].lz=i;
cc[nr].cz=j;
nr++;
}
for(i=0;i<nr;i++)
{
x.lz=cc[i].lz;
x.cz=cc[i].cz;
dl[0]=1;
dl[1]=0;
dl[2]=-1;
dl[3]=0;
dc[0]=0;
dc[1]=1;
dc[2]=0;
dc[3]=-1;
for(j=0;j<4;j++)
if(px[x.lz+dl[j]][x.cz+dc[j]]==0 && a[x.lz+dl[j]][x.cz+dc[j]]!='*' && a[x.lz+dl[j]][x.cz+dc[j]]!='D' && p[x.lz+dl[j]][x.cz+dc[j]]>=nub)
{
y.lz=x.lz+dl[j];
y.cz=x.cz+dc[j];
px[y.lz][y.cz]=px[x.lz][x.cz]+1;
cc[nr]=y;
nr++;
}
}
if(px[pf1][pf2]!=0)
{
printf("%d\n",nub);
return 0;
}
return 0;
}
int cb()
{
int i=0,pas=1<<11;
int cheap=max(m,n);
for(i=0;pas;pas>>=1)
if(l2(i+pas))
i+=pas;
return i;
}
int main()
{
int i,j,nn;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&m,&n);
for(i=1;i<=m;i++)
gets(a[i]+1);
for(i=0;i<=m+1;i++)
{
a[i][0]='*';
a[i][n+1]='*';
}
for(j=0;j<=n+1;j++)
{
a[0][j]='*';
a[m+1][j]='*';
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(a[i][j]=='O')
{
pf1=i;
pf2=j;
}
l1();
sf=max(m,n);
for(nn=sf;nn>=1;nn--)
{
l2(nn);
if(px[pf1][pf2]!=0)
return 0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
px[i][j]=0;
}
printf("-1\n");
return 0;
}