Cod sursa(job #3258219)

Utilizator DariusHHanganu Darius DariusH Data 21 noiembrie 2024 16:15:56
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

#define N_MAX 1000
#define NR_DIR 4

int dist[N_MAX][N_MAX], visited[N_MAX][N_MAX];
char v[N_MAX][N_MAX];
int n, m, lin_i, col_i, lin_o, col_o;

int dir_lin[NR_DIR] = {-1, 1, 0, 0};
int dir_col[NR_DIR] = {0, 0, -1, 1};

int is_valid(int lin, int col) {
    return (lin >= 0 && col >= 0 && lin < n && col < m && !visited[lin][col]);
}

void bfs() {
    queue<pair<int,int>> q;
    int i, j, lin, col, new_lin, new_col;
    for(i = 0; i < n; ++i) {
        for(j = 0; j < m; ++j) {
            if(v[i][j] == 'D') {
                q.push({i, j});
                visited[i][j] = 1;
            }
        }
    }

    while(!q.empty()) {
        lin = q.front().first;
        col = q.front().second;
        for(i = 0; i < NR_DIR; ++i) {
            new_lin = lin + dir_lin[i];
            new_col = col + dir_col[i];
            if(is_valid(new_lin, new_col) && v[new_lin][new_col] != '*') {
                q.push({new_lin, new_col});
                dist[new_lin][new_col] = dist[lin][col] + 1;
                visited[new_lin][new_col] = 1;
            }
        }
        q.pop();
    }
}

int check(int d) {
    if(dist[lin_i][col_i] < d) {
        return 0;
    }

    queue<pair<int,int>> q;
    int i, j, lin, col, new_lin, new_col;

    q.push({lin_i, col_i});

    for(i = 0; i < n; ++i) {
        for(j = 0; j < m; ++j) {
            visited[i][j] = 0;
        }
    }

    visited[lin_i][col_i] = 1;

    while(!q.empty()) {
        lin = q.front().first;
        col = q.front().second;
        for(i = 0; i < NR_DIR; ++i) {
            new_lin = lin + dir_lin[i];
            new_col = col + dir_col[i];
            if(is_valid(new_lin, new_col) && dist[new_lin][new_col] >= d && v[new_lin][new_col] != '*') {
                q.push({new_lin, new_col});
                visited[new_lin][new_col] = 1;
            }
        }
        q.pop();
    }

    return visited[lin_o][col_o];
}


int main()
{
    int i, j, st, dr, mid;
    fin >> n >> m;
    for(i = 0; i < n; ++i) {
        for(j = 0; j < m; ++j) {
            fin >> v[i][j];
            if(v[i][j] == 'I') {
                lin_i = i;
                col_i = j;
            }else if(v[i][j] == 'O') {
                lin_o = i;
                col_o = j;
            }
        }
    }

    bfs();
    st = 0;
    dr = N_MAX * N_MAX + 1;
    while(st <= dr) {
        mid = (st + dr) / 2;
        if(check(mid)) {
            st = mid + 1;
        }else{
            dr = mid - 1;
        }
    }

    if(!check(1)) {
        fout << "-1\n";
    }else{
        fout << dr << '\n';
    }

    return 0;
}