Pagini recente » Cod sursa (job #1935523) | Cod sursa (job #112414) | Cod sursa (job #1929381) | Cod sursa (job #1562665) | Cod sursa (job #1333430)
#include <fstream>
#include <cstring>
#define DIM 1005
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int N,D[DIM][DIM],M,I,C,p,u,sol,F,T;
bool viz[DIM][DIM];
struct coada {int x,y;}Coada[DIM*DIM];
char x;
const int di[]={1,0,-1,0},dj[]={0,1,0,-1};
int Lee(int val){
if(D[I][C]<val)
return 0;
int p,u;
p=u=1;
memset(viz,0,sizeof(viz));
Coada[1].x=I;
Coada[1].y=C;
viz[I][C]=1;
while(p<=u){
coada b=Coada[p++];
for(int i=0;i<4;i++){
coada k;
k.x=b.x+di[i];
k.y=b.y+dj[i];
if(k.x>=1 && k.x<=N && k.y>=1 && k.y<=M && !viz[k.x][k.y] && D[k.x][k.y]>=val){
Coada[++u]=k;
viz[k.x][k.y]=1;
if(k.x==F && k.y==T)
return 1;
}
}
}
return 0;
}
int main(){
fin>>N>>M;
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++){
fin>>x;
if(x=='I'){
I=i;
C=i;
}
if(x=='D'){
Coada[++u].x=i;
Coada[u].y=j;
D[i][j]=1;
}
if(x=='*'){
D[i][j]=-1;
}
if(x=='O'){
F=i;
T=j;
}
}
p=1;
while(p<=u){
coada b=Coada[p++];
for(int i=0;i<4;i++){
coada k;
k.x=b.x+di[i];
k.y=b.y+dj[i];
if(k.x>=1 && k.x<=N && k.y>=1 && k.y<=M && !D[k.x][k.y]){
D[k.x][k.y]=D[b.x][b.y]+1;
Coada[++u]=k;
}
}
}
p=0;
u=DIM*DIM;
sol=DIM*DIM*DIM;
while(p<=u){
int mid=(p+u)>>1;
if(Lee(mid)){
p=mid+1;
sol=mid;
}
else
u=mid-1;
}
if(sol==DIM*DIM*DIM)
fout<<-1;
else{
if(sol==0)
fout<<0;
else
fout<<sol-1;
}
fin.close();fout.close();
return 0;
}