Pagini recente » Cod sursa (job #2972266) | Cod sursa (job #184341) | Cod sursa (job #2166651) | Cod sursa (job #449405) | Cod sursa (job #917592)
Cod sursa(job #917592)
#include <cstdio>
using namespace std;
int max[1002][1002],x,y,a[1002][1002],dist,sfx,sfy,stx,sty,n,m,i,j,d,maxpar[1002][1002],st,sf,stiv[1000000][3];
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;
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%ld%ld",&n,&m);
sf=0;st=1;
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;stiv[++sf][0]=i;stiv[sf][1]=j;stiv[sf][2]=1;max[i][j]=1;}
}}
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;}
while(sf>=st){
if((max[stiv[st][0]+1][stiv[st][1]]==0)&&(a[stiv[st][0]+1][stiv[st][1]]!=-1)){
max[stiv[st][0]+1][stiv[st][1]]=stiv[st][2]+1;
stiv[sf+1][0]=stiv[st][0]+1;
stiv[sf+1][1]=stiv[st][1];
stiv[sf+1][2]=stiv[st][2]+1;
sf++;
}
if((max[stiv[st][0]-1][stiv[st][1]]==0)&&(a[stiv[st][0]-1][stiv[st][1]]!=-1)){
max[stiv[st][0]-1][stiv[st][1]]=stiv[st][2]+1;
stiv[sf+1][0]=stiv[st][0]-1;
stiv[sf+1][1]=stiv[st][1];
stiv[sf+1][2]=stiv[st][2]+1;
sf++;
}
if((max[stiv[st][0]][stiv[st][1]+1]==0)&&(a[stiv[st][0]][stiv[st][1]+1]!=-1)){
max[stiv[st][0]][stiv[st][1]+1]=stiv[st][2]+1;
stiv[sf+1][0]=stiv[st][0];
stiv[sf+1][1]=stiv[st][1]+1;
stiv[sf+1][2]=stiv[st][2]+1;
sf++;
}
if((max[stiv[st][0]][stiv[st][1]-1]==0)&&(a[stiv[st][0]][stiv[st][1]-1]!=-1)){
max[stiv[st][0]][stiv[st][1]-1]=stiv[st][2]+1;
stiv[sf+1][0]=stiv[st][0];
stiv[sf+1][1]=stiv[st][1]-1;
stiv[sf+1][2]=stiv[st][2]+1;
sf++;
}
++st;
}
dist=max[stx][sty];x=stx;y=sty;fill(dist);
printf("%ld",maxpar[sfx][sfy]-1);
return 0;
}