Cod sursa(job #2793555)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 3 noiembrie 2021 18:52:16
Problema Barbar Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
#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;
}