Pagini recente » Cod sursa (job #2677536) | Cod sursa (job #2201845) | Cod sursa (job #2279005) | Cod sursa (job #370929) | Cod sursa (job #650031)
Cod sursa(job #650031)
#include <stdio.h>
#define val 1001
int di[]={1 , -1 , 0 , 0};
int dj[]={0 , 0 , 1 , -1};
int i , j , n , m , ic , jc , iv , jv , d , x1 , y1 , x2 , y2 , d1 , iv1 , jv1 , mid , st , dr , p , u;
char a[val];
int C[2][val*val];
int V[val][val];
void coada1(){
char Z[val][val];
for(int q=1;q<=n;q++){
for(int w=1;w<=m;w++){
Z[q][w]=0;
}
}
Z[i][j]=1;
p=1;u=1;
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] && V[iv][jv]>=0 && V[iv][jv]!=1){
if(V[iv][jv]==0){
V[iv][jv]=1+V[ic][jc];
}
else
if(V[iv][jv]>V[ic][jc]+1)
V[iv][jv]=V[ic][jc]+1;
C[0][++u]=iv;
C[1][u]=jv;
Z[iv][jv]=1;
}
}
p++;
}
}
int coada(int maxim){
p=1;u=1;
C[0][p]=x1;C[1][p]=y1;
char Z[val][val];
for(int q=1;q<=n;q++){
for(int w=1;w<=m;w++){
Z[q][w]=0;
}
}
Z[x1][y1]=1;
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] && (V[iv][jv]-1)>=maxim){
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(){
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%s",a);
for(j=1;j<=m;j++){
if(a[j-1]=='D'){
V[i][j]=1;
C[0][1]=i;
C[1][1]=j;
coada1();
}
if(a[j-1]=='*')
V[i][j]=-1;
if(a[j-1]=='I'){
x1=i;y1=j;
}
if(a[j-1]=='O'){
x2=i;y2=j;
}
}
}
/*for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(V[i][j]==1){
C[0][1]=i;
C[1][1]=j;
coada1();
}
}
}*/
st=1;dr=n+m;
while(st<=dr){
mid=(st+dr)/2;
if((V[x1][y1]-1)>=mid&&coada(mid)){
st=mid+1;
}
else{
dr=mid-1;
}
}
mid=(st+dr)/2;
if((V[x1][y1]-1)>=mid&&coada(mid))
printf("%d",mid);
else
printf("%d",-1);
return 0;
}