Pagini recente » Cod sursa (job #2875488) | Cod sursa (job #72612) | Cod sursa (job #2331484) | Cod sursa (job #894444) | Cod sursa (job #1863742)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#define N 1010
#define INF 101000100
using namespace std;
struct poz{
int l , c;
};
poz temp , en , st , nod ;
char mat [ N ][ N ];
int dist [ N ][ N ];
bool viz [ N ][ N ];
queue < poz > que;
int dl [] ={ 0 , -1 , 0 , 1 };
int dc [] ={ 1 , 0 , -1 , 0 };
int lin , col ;
void finddrags (){
static int ll ,cc ,k ;
while ( !que.empty() ){
nod = que.front();
que.pop();
for ( k = 0 ; k < 4 ; k ++ ){
ll = nod.l + dl[ k ];
cc = nod.c + dc[ k ];
if ( ll >= 0 && ll < lin && cc >=0 && cc < col ){
if ( dist [ ll ][ cc ] > dist [ nod.l ][ nod.c ] + 1 ){
dist [ ll ][ cc ] = dist [ nod.l ][ nod.c ] + 1 ;
temp.l = ll ;
temp.c = cc ;
que.push( temp );
}
}
}
}
}
void printdist ( ){
static int i , j ;
for ( i = 0 ; i < lin ; i ++ ){
for ( j = 0 ; j < col ; j++ ){
printf("%3d ",dist [ i ][ j ] );
}
printf("\n");
}
}
bool solve ( int dmin ){
static int i , j , k ,ll , cc ;
que.push( st );
for ( i = 0 ; i < lin ; i++ ){
for ( j = 0 ; j <col;j ++ ){
viz[ i ] [ j ] = 0 ;
}
}
viz [ st.l ][ st.c ] = 1 ;
if ( dist [ st.l ][ st.c ] < dmin ){
return 0 ;
}
while( !que.empty() ){
nod = que.front();
que.pop();
for ( k = 0 ; k < 4 ; k ++ ){
ll = nod.l + dl[ k ];
cc = nod.c + dc[ k ];
if ( ll >= 0 && ll < lin && cc >=0 && cc < col ){
if ( dist [ ll ][ cc ] >= dmin && viz [ ll ][ cc ] == 0 ){
viz [ ll ][ cc ] = 1 ;
temp.l = ll ;
temp.c = cc ;
que.push( temp );
}
}
}
}
return viz [ en.l ][ en.c ];
}
int bnrsch ( int l , int r ){
static int mid , sol ;
while ( l < r ){
mid = ( l + r ) /2 ;
sol = solve ( mid );
if ( sol == 0 ){
r = mid ;
}else {
l = mid +1 ;
}
}
return l- 1 ;
}
int main(){
int i , j ;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d",&lin,&col);
for ( i = 0 ; i < lin ; i ++ ){
scanf("%s",mat [ i ] );
}
for ( i = 0 ; i < lin ; i ++ ){
for ( j = 0 ; j < col ; j ++){
temp.l = i ;
temp.c = j ;
if( mat [ i ] [ j ] == 'D'){
que.push( temp );
dist[ i ] [ j ] = 0 ;
}else if( mat [ i ][ j ] == '*'){
dist [ i ][ j ] = -1 ;
}else if ( mat [ i ][ j ] == 'I' ){
dist [ i ][ j ]= INF ;
st = temp;
}else if ( mat [ i ][ j ] == 'O' ){
dist [ i ][ j ] = INF ;
en = temp ;
}else {
dist [ i ] [ j ] = INF ;
}
}
}
finddrags();
// printdist ( );
int vmax = 0;
for ( i = 0; i < lin ; i++ ){
for ( j = 0 ; j < col ; j++ ){
vmax = max ( vmax , dist [ i ][ j ] );
}
}
printf("%d",bnrsch ( 0 , vmax ) );
return 0;
}