Pagini recente » Cod sursa (job #1229202) | Cod sursa (job #1933065) | Cod sursa (job #269724) | Cod sursa (job #1241926) | Cod sursa (job #911181)
Cod sursa(job #911181)
#include <cstdio>
using namespace std;
int max[1002][1002],x,y,a[1002][1002],dist,sfx,sfy,stx,sty,n,m,i,j,drx[1000000],dry[1000000],d,maxpar[1002][1002];
char c;
int min(int p1,int p2)
{
if(p1<p2){return p1;}
else{return p2;}
}
void fill(int dist)
{
if((maxpar[x][y]==0)&&(a[x][y]>=0)){
maxpar[x][y]=min(max[x][y],dist);
dist=maxpar[x][y];
++x;fill(dist);x-=2;fill(dist);++x;
++y;fill(dist);y-=2;fill(dist);++y;
}
if((maxpar[x][y]<dist)&&(a[x][y]>=0)&&(max[x][y]>=dist)){
maxpar[x][y]=dist;
++x;fill(dist);x-=2;fill(dist);++x;
++y;fill(dist);y-=2;fill(dist);++y;
}
}
void filldr()
{
if(((max[x][y]>dist)||(max[x][y]==0))/*&&(a[x][y]!=-1)*/){
max[x][y]=dist;
dist++;
++x;filldr();x-=2;filldr();++x;
++y;filldr();y-=2;filldr();++y;
dist--;
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(i=1;i<=n;i++){scanf("\n");for(j=1;j<=m;j++){
scanf("%c",&c);
if(c=='.'){a[i][j]=0;}
if(c=='*'){a[i][j]=-1;}
if(c=='I'){a[i][j]=0;stx=i;sty=j;}
if(c=='O'){
a[i][j]=0;sfx=i;sfy=j;}
if(c=='D'){a[i][j]=0;drx[++d]=i;dry[d]=j;}
}}
for(i=0;i<=n+1;i++){a[i][0]=-1;a[i][m+1]=-1;}
for(j=0;j<=m+1;j++){a[0][j]=-1;a[n+1][j]=-1;}
for(i=1;i<=d;i++){x=drx[i];y=dry[i];dist=1;filldr();}
// for(i=1;i<=d;i++){x=drx[i];y=dry[i];a[x][y]=-1;}
dist=max[stx][sty];x=stx;y=sty;fill(dist);
printf("%ld",maxpar[sfx][sfy]-1);
return 0;
}