Pagini recente » Cod sursa (job #560490) | Cod sursa (job #394662) | Clasamentul arhivei de probleme | Cod sursa (job #956681) | Cod sursa (job #648904)
Cod sursa(job #648904)
#include <fstream.h>
#define val 1008
int di[]={1 , -1 , 0 , 0};
int dj[]={0 , 0 , 1 , -1};
int i , j , m , n , k ,d , x1 , x2 , y1 , y2 , min=-1 , st , dr;
char a[val];
int V[val][val];
int C[2][val*val];
void coada1(){
int p=1,u=k;
int iv , jv , ic , jc;
while(p<=u){
ic=C[0][p];jc=C[1][p];
for(d=0;d<=3;d++){
iv=ic+di[d];
jv=jc+dj[d];
if(iv>=1&&iv<=n&&jv>=1&&jv<=m&&V[iv][jv]!=1&&V[iv][jv]>=0){
if(V[iv][jv]==0)
V[iv][jv]=V[ic][jc]+1;
else
if(V[iv][jv]>V[ic][jc]+1)
V[iv][jv]=V[ic][jc]+1;
C[0][++u]=iv;
C[1][u]=jv;
}
}
p++;
}
}
int coada(int z){
int p=1,u=1;
C[0][1]=x1;
C[1][1]=y1;
int Z[val][val];
int iv , jv , ic , jc , iv1 , jv1 , d1;
while(p<=u){
ic=C[0][p];
jc=C[1][p];
for(d=0;d<=3;d++){
iv=ic+di[d];
jv=jc+dj[d];
if(iv>=1 && iv<=n && jv>=1 && jv<=m && Z[iv][jv]==0 && V[iv][jv]-1<=z && V[iv][jv]!=1 && V[iv][jv]>0){
Z[iv][jv]=1;
C[0][++u]=iv;
C[1][u]=jv;
for(d1=0;d1<=3;d1++){
iv1=iv+di[d1];
jv1=jv+dj[d1];
if(iv1==x2&&jv1==y2)
return 1;
}
}
}
p++;
}
return 0;
}
int main(){
ifstream f("barbar.in");
ofstream g("barbar.out");
f>>n>>m;
for(i=1;i<=n;i++){
f>>a;
for(j=1;j<=m;j++){
if(a[j-1]=='*')
V[i][j]=-1;
if(a[j-1]=='D'){
V[i][j]=1;
C[0][++k]=i;
C[1][k]=j;
}
if(a[j-1]=='I'){
x1=i;y1=j;
}
if(a[j-1]=='O'){
x2=i;y2=j;
}
}
}
coada1();
st=1;dr=n+m;
while(st<=dr){
k=(st+dr)/2;
if(coada(k)){
st=k+1;
min=k;
}
else{
dr=k-1;
}
}
if(min>0)
printf("%d",min);
else
printf("%d",-1);
return 0;
}