Pagini recente » Cod sursa (job #1768760) | Cod sursa (job #1973330) | Cod sursa (job #578801) | Cod sursa (job #2295256) | Cod sursa (job #2799304)
#include <fstream>
#include <queue>
using namespace std;
const int N = 1000;
char a [ N ][ N ];
int dist [ N ][ N ], traseu [ N ][ N ];
int d_lin[4] = { -1, 0, 1, 0 };
int d_col[4] = { 0, 1, 0, -1 };
queue < pair <int, int> > lee;
int main ( ) {
ifstream fin ( "barbar.in" );
ofstream fout ( "barbar.out" );
int n, m, i, j, lin0 = 0, col0 = 0, linF = 0, colF = 0, max = 0;
fin >> n >> m;
for ( i = 0; i < n; i++ ){
for ( j = 0; j < m; j++ ){
fin >> a [ i ][ j ];
if ( a[ i ][ j ] == 'D' ){
lee.push ( { i, j } );
dist [ i ][ j ] = 1;
}
if ( a[ i ][ j ] == '*' ){
dist [ i ][ j ] = -1;
}
}
}
while ( lee.size () > 0 ) {
pair <int, int> c = lee.front();
lee.pop();
if ( c.first >= 0 && c.first < n && c.second >= 0 && c.second < m && dist[ c.first ][ c.second ] != -1 ){
for ( int i = 0; i < 4; i++ ) {
int lin1 = c.first + d_lin [ i ];
int col1 = c.second + d_col [ i ];
if ( lin1 >= 0 && lin1 < n && col1 >= 0 && col1 < m && dist [ lin1 ][ col1 ] == 0 ) {
dist [ lin1 ][ col1 ] = dist[ c.first ][ c.second ] + 1;
lee.push ( { lin1, col1 } );
}
}
}
}
for ( i = 0; i < n; i++ ){
for ( j = 0; j < m; j++ ){
if ( a [ i ][ j ] == 'I' ){
lin0 = i;
col0 = j;
}
if ( a [ i ][ j ] == 'O' ){
linF = i;
colF = j;
}
dist [ i ][ j ] -- ;
if ( dist [ i ][ j ] > max )
max = dist [ i ][ j ];
}
}
int st = 1, dr = max, mij;
while ( st != dr ) {
mij = ( dr + st ) / 2;
lee.push ( { lin0, col0 } );
traseu[ lin0 ][ col0 ] = 1;
while ( traseu [ linF ][ colF ] == 0 && lee.size ( ) > 0 ) {
pair < int, int > c = lee.front ( );
lee.pop ( );
if ( c.first >= 0 && c.first < N && c.second >= 0 && c.second < N && traseu [ c.first ][ c.second ] == 0 && dist [ c.first ][ c.second ] >= mij && dist [ c.first ][ c.second ] >= 0 ){
for ( int i = 0; i < 4; i++ ) {
int lin1 = c.first + d_lin [ i ];
int col1 = c.second + d_col [ i ];
if ( traseu [ lin1 ][ col1 ] == 0 ) {
traseu [ lin1 ][ col1 ] = traseu [ c.first ][ c.second ] + 1;
lee.push ( { lin1, col1 } );
}
}
}
}
if ( traseu [ linF ][ colF ] == 1 || lee.size ( ) > 0 )
st = mij + 1;
else
dr = mij;
for ( i = 0; i < n; i++ )
for ( j = 0; j < m; j++ )
traseu [ i ][ j ] = 0;
while ( lee.size ( ) > 0 )
lee.pop ( );
}
fout << st + 1;
return 0;
}