Pagini recente » Cod sursa (job #2767013) | Cod sursa (job #2507630) | Cod sursa (job #582415) | Cod sursa (job #984716) | Cod sursa (job #371576)
Cod sursa(job #371576)
#include<stdio.h>
#define mod 3999988
int i,j,n,m,a[1100][1100],b[1100][1100],k,ii,ij,fi,fj,max=-1,viz[2000000],val,ok;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
struct nod
{
int x,y;
}p[5000000];
char s[1100][1100];
void compara(int i,int j)
{
for(int t=0;t<4;t++) { int i1=i+dx[t];
int j1=j+dy[t];
if(i1<=n&&i1>0&&j1<=m&&j1>0)
{ if((b[i1][j1]==0||b[i1][j1]>b[i][j]+1)&&(s[i1][j1]!='D'))
{ b[i1][j1]=b[i][j]+1;
p[++k].x=i1;
p[k].y=j1;
}
}
}
}
int ver(int i,int j)
{
if(b[i][j]>=val&&s[i][j]!='*'&&s[i][j]!='D')
{
viz[(i-1)*1001+j]=val;
if(i==fi&&j==fj&&val>max) { max=val;
ok=1;
}
else for(int t=0;t<4;++t) { int i1=i+dx[t];
int j1=j+dy[t];
if(i1<=n&&i1>0&&j1<=m&&j1>0)
if(viz[(i1-1)*1001+j1]!=val) ver(i1,j1);
}
}
return 0;
}
int cautbin()
{
int st=1,dr=1100,mij=0;
while(st<=dr) { mij=(st+dr)/2;
val=mij;
ok=0;
ver(ii,ij);
if(ok) st=mij+1;
else dr=mij-1;
}
return 0;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{ scanf("%s",s[i]+1);
for(j=1;j<=m;j++) { if(s[i][j]=='*') b[i][j]=-1;
else if(s[i][j]=='D') { p[++k].x=i;
p[k].y=j;
}
else if(s[i][j]=='I') { ii=i;
ij=j;
}
else if(s[i][j]=='O') { fi=i;
fj=j;
}
}
}
for(i=1;i<=k;i++) {
compara(p[i].x,p[i].y);
}
cautbin();
printf("%d\n",max);
fclose(stdin);
fclose(stdout);
return 0;
}