Pagini recente » Cod sursa (job #1959479) | Cod sursa (job #1635822) | Cod sursa (job #601647) | Istoria paginii runda/123456789101111111/clasament | Cod sursa (job #191093)
Cod sursa(job #191093)
#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*5];
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(a[i][j]=='*') b[i][j]=-1;
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(b[x+lin[t]][y+col[t]]>=p && c[x+lin[t]][y+col[t]]==0){
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]=0;
}
int solve(int lung){
int ok=0,i;
v[0].x=1;p=lung;
v[1].x=x1;v[1].y=y1;
curat();
for(i=1;i<=v[0].x;i++){
if(v[i].x==x2 && v[i].y==y2) {
ok=1;
break;
}
lee2(v[i].x,v[i].y);
}
return ok;
}
int main(){
int i,j,st=1,dr=10000000,mij;
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;
}
if(b[x1][y1]==-2) st=0;
printf("%d",st-1);
return 0;
}