Pagini recente » Cod sursa (job #568909) | Cod sursa (job #1732368) | Cod sursa (job #237064) | Cod sursa (job #1648725) | Cod sursa (job #1856398)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#define N 1010
#define INF 10000
using namespace std;
int mindist [ N ][ N ];
int dist [ N ][ N ];
int inque [ N ][ N ];
int lin , col ;
deque < pair <int , int > > que ;
int dl [] ={ 0 , 1 , 0 , - 1 };
int dc [] ={ 1 , 0 , -1 , 0 };
void fill_drag (){
int i , j , k , l , c;
while( !que.empty() ){
i = que.front().first ;
j = que.front().second ;
que.pop_front() ;
inque [ i ][ j ] = 0;
for ( k = 0 ; k < 4 ; k++ ){
l = dl[ k ];
c = dc[ k ];
if ( i + l < lin && i + l >=0 && j + c < col && j + c >= 0 ){
if ( dist [ i ] [ j ] + 1 < dist [ i + l ] [ j + c ] ){
dist [ i + l ] [ j + c ] = dist [ i ] [ j ] + 1 ;
if ( inque [ i + l ][ j + c ] ){
continue;
}else{
que.push_back( make_pair( i + l , j + c ) );
inque [ i + l ][ j + c ]= 1;
}
}
}
}
}
}
void lee ( ){
int i , j , k , l , c;
while( !que.empty() ){
i = que.front().first ;
j = que.front().second ;
que.pop_front() ;
inque [ i ][ j ] = 0;
for ( k = 0 ; k < 4 ; k++ ){
l = dl[ k ];
c = dc[ k ];
if ( i + l < lin && i + l >=0 && j + c < col && j + c >= 0 ){
if ( mindist [ i ] [ j ] > mindist [ i + l ][ j + c ] && mindist [ i + l ] [ j + c ] != -2 ){
mindist [ i + l ][ j + c ] = min ( dist [ i + l ] [ j + c ] , mindist [ i ][ j ] );
if ( inque [ i + l ][ j + c ] ){
continue;
}else{
if ( mindist [ i + l ][ i + c ] == dist [ i + l ][ i + c ] ){
que.push_back( make_pair( i + l , j + c ) );
}else{
que.push_front( make_pair( i + l , j + c ) );
}
inque [ i + l ][ j + c ]= 1;
}
}
}
}
}
}
int main(){
int i , j ;
char ch ;
int sti ,stj ,soli , solj ;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d",&lin , &col );
for ( i = 0 ; i <= lin ; i ++ ){
for ( j = 0 ; j <= col ; j ++ ){
dist [ i ][ j ] = INF ;
mindist [ i ] [ j ] = -1;
}
}
scanf("%c",&ch);
for ( i = 0 ; i < lin ; i ++ ){
for ( j = 0 ; j < col ; j ++ ){
scanf("%c",&ch );
if ( ch == 'D' ){
que.push_front( make_pair( i , j ) );
dist[ i ] [ j ] = 0;
}else if ( ch == 'I' ){
sti = i ;
stj = j ;
}else if ( ch == '*' ){
mindist [ i ][ j ] = -2 ;
dist [ i ][ j ] = -1 ;
}else if ( ch == 'O'){
soli = i ;
solj = j ;
}else{
}
}
scanf("%c",&ch);
}
fill_drag ( );
// for ( i = 0 ; i < lin ; i ++ ){
// for ( j = 0 ; j < col ; j ++ ){
// printf("%d ",dist [ i ][ j ]);
//
// }
// printf("\n");
// }
// for ( i = 0 ; i < lin ; i ++ ){
// for ( j = 0 ; j < col ; j ++ ){
// mindist[ i ][ j ] = 0 ;
// }
//
// }
que.push_front(make_pair( sti , stj ) );
mindist [ sti ] [ stj ] = dist [ sti ][ stj ];
// for ( i = 0 ; i < lin ; i ++ ){
// for ( j = 0 ; j < col ; j ++ ){
// printf("%3d ",mindist [ i ][ j ]);
//
// }
// printf("\n");
// }
lee();
// for ( i = 0 ; i < lin ; i ++ ){
// for ( j = 0 ; j < col ; j ++ ){
// printf("%3d ",mindist [ i ][ j ]);
//
// }
// printf("\n");
// }
printf("%d",mindist [ soli ][ solj ] );
return 0;
}