Pagini recente » Cod sursa (job #697260) | Statistici Bota Mihnea (mihneabota) | Profil M@2Te4i | Cod sursa (job #1844098) | Cod sursa (job #191298)
Cod sursa(job #191298)
#include <stdio.h>
#define N 1005
int b[N][N],m,n,p,x2,y2,x1,y1;
char c[N][N];
struct ab{
int x,y;
};
ab v[N*N];
const int lin[]={0,0,1,-1};
const int col[]={1,-1,0,0};
void lee(int x,int y){
for(int t=0;t<4;t++)
if(b[x+lin[t]][y+col[t]]==-2){
b[x+lin[t]][y+col[t]]=b[x][y]+1;
v[++v[0].x].x=x+lin[t];
v[v[0].x].y=y+col[t];
}
}
void citire(){
int i,j;
char x;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&m,&n);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++){
scanf("%c\n",&x);
if(x=='D') {
v[++v[0].x].x=i;
v[v[0].x].y=j;
}
else if(x=='*') b[i][j]=-1;
else b[i][j]=-2;
if(x=='O') {
x2=i;
y2=j;
}
if(x=='I'){
x1=i;
y1=j;
}
}
}
void lee2(int x,int y){
for(int t=0;t<4;t++)
if(c[x+lin[t]][y+col[t]]==-1 && b[x+lin[t]][y+col[t]]>=p){
v[++v[0].x].x=x+lin[t];
v[v[0].x].y=y+col[t];
c[x+lin[t]][y+col[t]]=1;
}
}
void curat(){
int i,j;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
c[i][j]=-1;
}
int solve(int lung){
int i;
v[0].x=1;p=lung;
v[1].x=x1;v[1].y=y1;
curat();
if(b[x1][y1]<p) return 0;
for(i=1;i<=v[0].x;i++){
if(c[x2][y2]==1) return 1;
lee2(v[i].x,v[i].y);
}
if(c[x2][y2]==1) return 1;
return 0;
}
int main(){
int i,j,st=0,dr=N*N*10,mij,x;
citire();
for(i=1;i<=v[0].x;i++)
lee(v[i].x,v[i].y);
while(st<=dr){
mij=(st+dr)/2;
if(solve(mij)) st=mij+1;
else dr=mij-1;
}
printf("%d",st-1);
return 0;
}