Pagini recente » Cod sursa (job #2302907) | Cod sursa (job #1436892) | Cod sursa (job #538702) | Cod sursa (job #1221250) | Cod sursa (job #903078)
Cod sursa(job #903078)
#include<stdio.h>
#include<fstream>
using namespace std;
int N,M,xi,yi,xf,yf;
int dragoni[1002][1002],barbar[1002][1002];
char a[1002][1002];
int dx[]={1,0,-1,0},
dy[]={0,1,0,-1};
struct co{int x,y;};
typedef co coada[1001*1000];
ifstream fin("barbar.in");
ofstream fout("barbar.out");
void init(){
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
barbar[i][j]=0;
}
int incc,sfc;
coada c;
void Lee(int sol){
init();
incc=sfc=1;
c[1].x=xi;c[1].y=yi;
if(dragoni[xi][yi]<sol) return;
while(incc<=sfc){
int xx=c[incc].x,yy=c[incc].y;
++incc;
for(int k=0;k<=3;k++){
int xxx=xx+dx[k],yyy=yy+dy[k];
if(xxx&&yyy&&xxx<=N&&yyy<=M&&dragoni[xxx][yyy]>=sol&&barbar[xxx][yyy]==0&&a[xxx][yyy]!=1){
c[++sfc].x=xxx;
c[sfc].y=yyy;
barbar[xxx][yyy]=barbar[xx][yy]+1;
}
}
}
}
int main(){
fin>>N>>M;
char x;
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++){
fin>>x;
if(x=='.') a[i][j]=0;
if(x=='*') a[i][j]=1;
if(x=='D') a[i][j]=2;
if(x=='I') {xi=i;yi=j;a[i][j]=0;}
if(x=='O') {xf=i;yf=j;a[i][j]=0;}
dragoni[i][j]=-1;
}
incc=1;sfc=0;
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
if(a[i][j]==2){
c[++sfc].x=i;c[sfc].y=j;
dragoni[i][j]=0;
}
while(incc<=sfc){
for(int k=0;k<=3;k++){
int xx,yy;
xx=c[incc].x+dx[k];
yy=c[incc].y+dy[k];
if(xx&&yy&&xx<=N&&yy<=M&&(dragoni[xx][yy]==-1||dragoni[xx][yy]>dragoni[c[incc].x][c[incc].y]+1)&&a[xx][yy]!=1){
dragoni[xx][yy]=dragoni[c[incc].x][c[incc].y]+1;
c[++sfc].x=xx;
c[sfc].y=yy;
}
}
++incc;
}
/* for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++)
printf("%d ",dragoni[i][j]);
printf("\n");
}
*/
int li=0,lf=1000*1000;
while(lf-li>1){
int mij = (li+lf)/2;
Lee(mij);
if(barbar[xf][yf])
li=mij;
else
lf=mij;
}
Lee(lf);
if(barbar[xf][yf])
fout<<lf<<"\n";
else{
Lee(li);
if(barbar[xf][yf])
fout<<li<<"\n";
else
fout<<"-1\n";
}
fin.close();
fout.close();
}