Pagini recente » Cod sursa (job #1867574) | Cod sursa (job #396057) | Cod sursa (job #631114) | Cod sursa (job #2147381) | Cod sursa (job #2793555)
#include <fstream>
#include <queue>
#include <string>
using namespace std;
ifstream cin ( "barbar.in" );
ofstream cout ( "barbar.out" );
#define NM_MAX 1000
#define INF -1
int dirl[] = {1, -1, 0, 0};
int dirc[] = {0, 0, 1, -1};
int viz[NM_MAX + 1][NM_MAX + 1];
int dist[NM_MAX + 1][NM_MAX + 1];
queue<pair<int, int>> BFS;
int n, m;
string mat[NM_MAX];
void dfs( int l, int c ) {
int dir, current_line, current_column;
viz[l][c] = 1;
for ( dir = 0; dir < 4; dir++ ) {
current_line = l + dirl[dir];
current_column = c + dirc[dir];
if ( current_line >= 0 && current_line < n && current_column >= 0 && current_column < m && viz[current_line][current_column] == 0 ) {
dfs( current_line, current_column );
}
}
}
int main() {
int i, j, start_x, start_y, finish_x, finish_y, current_line, current_column, next_line, next_column, st, dr, distanta;
cin >> n >> m;
for ( i = 0; i < n; i++ ) {
cin >> mat[i];
}
for ( i = 0; i < n; i++ ) {
for ( j = 0; j < mat[i].size(); j++ ) {
if ( mat[i][j] == 'I' ) {
start_x = i;
start_y = j;
}
else if ( mat[i][j] == 'O' ) {
finish_x = i;
finish_y = j;
}
else if ( mat[i][j] == 'D') {
dist[i][j] = 1;
BFS.push({i, j});
viz[i][j] = 1;
}
}
}
while ( !BFS.empty() ) {
current_line = BFS.front().first;
current_column = BFS.front().second;
for ( i = 0; i < 4; i++ ) {
next_line = current_line + dirl[i];
next_column = current_column + dirc[i];
if ( next_line >= 0 && next_line < n && next_column >= 0 && next_column < m ) {
if ( viz[next_line][next_column] == 0 && mat[next_line][next_column] != '*' ) {
dist[next_line][next_column] = dist[current_line][current_column] + 1;
BFS.push({next_line, next_column});
viz[next_line][next_column] = 1;
}
}
}
BFS.pop();
}
st = -1;
dr = dist[start_x][start_y];
while ( dr - st > 1 ) {
distanta = ( st + dr ) / 2;
for ( i = 0; i < n; i++ ) {
for ( j = 0; j < m; j++ ) {
if ( mat[i][j] != '*' || dist[i][j] < distanta )
viz[i][j] = INF;
else
viz[i][j] = 0;
}
}
dfs( start_x, start_y );
if ( viz[finish_x][finish_y] == 1 )
dr = distanta;
else
st = distanta;
}
cout << st - 1;
return 0;
}