Cod sursa(job #1609472)

Utilizator cristina_borzaCristina Borza cristina_borza Data 22 februarie 2016 20:27:30
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <utility>
#include <fstream>
#include <cstring>
#include <queue>

#define NMAX 1004

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

int n , m , d[NMAX][NMAX] , c[NMAX][NMAX] , xs , ys , xf , yf , DM;

char mat[NMAX][NMAX];

int dx[] = {-1 , 0 , 1 , 0};
int dy[] = {0 , 1 , 0 , -1};

queue <pair <int , int> > coada;

int caut_bin();
int verif(int val);

int main() {
    f >> n >> m;

    for(int i = 1 ; i <= n ; ++i) {
        for(int j = 1 ; j <= m ; ++j) {
            f >> mat[i][j];
        }
    }


    for(int i = 1 ; i <= n ; ++i) {
        for(int j = 1 ; j <= m ; ++j) {
            if(mat[i][j] == 'D') {
                coada.push(make_pair(i , j));
            }

            if(mat[i][j] == 'I') {
                xs = i;
                ys = j;

                d[i][j] = NMAX;
            }

            if(mat[i][j] == 'O') {
                xf = i;
                yf = j;

                d[i][j] = NMAX;
            }
        }
    }

    DM = max(n , m);

    while(!coada.empty()) {
        pair <int , int> aux = coada.front();
        coada.pop();

        for(int i = 0 ; i < 4 ; ++i) {
            if(d[aux.first + dx[i]][aux.second + dy[i]] == 0 && mat[aux.first + dx[i]][aux.second + dy[i]] == '.') {
                d[aux.first + dx[i]][aux.second + dy[i]] = d[aux.first][aux.second] + 1;
                coada.push(make_pair(aux.first + dx[i] , aux.second + dy[i]));
            }
        }
    }

    g << caut_bin();

    return 0;
}

int caut_bin() {
    int i , p = 0;

    for(i = 1 ; i <= DM ; i <<= 1);

    while(i) {
        if(verif(p + i)) {
            p += i;
        }

        i >>= 1;
    }

    if(p == 0) {
        return -1;
    }

    return p;
}


int verif(int val) {
    memset(c , 0 ,sizeof(c));

    while(!coada.empty()) {
        coada.pop();
    }

    coada.push(make_pair(xs , ys));

    while(!coada.empty()) {
        pair <int , int> aux = coada.front();

        if(aux.first == xf && aux.second == yf) {
            return 1;
        }

        coada.pop();

        for(int i = 0 ; i < 4 ; ++i) {
            if(c[aux.first + dx[i]][aux.second + dy[i]] == 0 && d[aux.first + dx[i]][aux.second + dy[i]] >= val && (mat[aux.first + dx[i]][aux.second + dy[i]] == '.' || mat[aux.first + dx[i]][aux.second + dy[i]] == 'O')) {
                c[aux.first + dx[i]][aux.second + dy[i]] = c[aux.first][aux.second] + 1;
                coada.push(make_pair(aux.first + dx[i] , aux.second + dy[i]));
            }
        }
    }

    if(c[xf][yf] != 0) {
        return 1;
    }

    return 0;
}