Pagini recente » Cod sursa (job #1430239) | Cod sursa (job #2893824) | Cod sursa (job #1681147) | Cod sursa (job #2009639) | Cod sursa (job #21579)
Cod sursa(job #21579)
#include<stdio.h>
int n,m,s,e,sx,sy,ex,ey;
char v[1010][1010];
long D[1010][1010],p,q,d[1000100],sol;
void READ()
{ int i,j;
FILE *f;
f=fopen("barbar.in","r");
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
D[i][j]=-1;
q=0;
for(i=1;i<=n;i++){
fscanf(f,"%s",&v[i]);
for(j=0;j<=m;j++){
if(v[i][j]=='D'){ d[++q]=1001*i+j+1; D[i][j+1]=0; }
if(v[i][j]=='*') D[i][j+1]=-2;
if(v[i][j]=='I') { sx=i; sy=j+1; }
if(v[i][j]=='O') { ex=i; ey=j+1; }
}
}
fclose(f);
}
void BUILD()
{ int x,y,i,j;
while(p<=q){
x=d[p]/1001;
y=d[p]%1001;
i=x-1; j=y;
if(i>0 && i<=n && j>0 && j<=m && D[i][j]==-1 && v[i][j-1]!='*'){
D[i][j]=D[x][y]+1;
d[++q]=1001*i+j;
}
i=x+1; j=y;
if(i>0 && i<=n && j>0 && j<=m && D[i][j]==-1 && v[i][j-1]!='*'){
D[i][j]=D[x][y]+1;
d[++q]=1001*i+j;
}
i=x; j=y-1;
if(i>0 && i<=n && j>0 && j<=m && D[i][j]==-1 && v[i][j-1]!='*'){
D[i][j]=D[x][y]+1;
d[++q]=1001*i+j;
}
i=x; j=y+1;
if(i>0 && i<=n && j>0 && j<=m && D[i][j]==-1 && v[i][j-1]!='*'){
D[i][j]=D[x][y]+1;
d[++q]=1001*i+j;
}
p++;
}
}
int ok(int k)
{ long exit,i,j,x,y;
q=1;p=1;
d[1]=sx*1001+sy;
exit=1001*ex+ey;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
v[i][j]=0;
v[sx][sy]=1;
while(p<=q){
x=d[p]/1001;
y=d[p]%1001;
i=x-1; j=y;
if(i>0 && i<=n && j>0 && j<=m && !v[i][j] && D[i][j]!=-2 && D[i][j]>=k){
v[i][j]=1;
d[++q]=1001*i+j;
if(d[q]==exit) return 1;
}
i=x+1; j=y;
if(i>0 && i<=n && j>0 && j<=m && !v[i][j] && D[i][j]!=-2 && D[i][j]>=k){
v[i][j]=1;
d[++q]=1001*i+j;
if(d[q]==exit) return 1;
}
i=x; j=y-1;
if(i>0 && i<=n && j>0 && j<=m && !v[i][j] && D[i][j]!=-2 && D[i][j]>=k){
v[i][j]=1;
d[++q]=1001*i+j;
if(d[q]==exit) return 1;
}
i=x; j=y+1;
if(i>0 && i<=n && j>0 && j<=m && !v[i][j] && D[i][j]!=-2 && D[i][j]>=k){
v[i][j]=1;
d[++q]=1001*i+j;
if(d[q]==exit) return 1;
}
p++;
}
return 0;
}
void SOLVE()
{ long step;
for(step=1;step<n*m;step=2*step);
for(sol=0;step;step=step/2)
if(ok(sol+step)) sol=sol+step;
}
void PRINT()
{
FILE *g;
g=fopen("barbar.out","w");
if(sol!=0) fprintf(g,"%ld",sol);
else fprintf(g,"-1");
fclose(g);
}
int main()
{
READ();
BUILD();
SOLVE();
PRINT();
return 0;
}