Cod sursa(job #2201232)

Utilizator GarboteialexGarbotei Alex Garboteialex Data 3 mai 2018 22:47:21
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;

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

#define DM 1001

int r, c;
char mat[DM][DM];
queue < pair < int, int > > lee1, lee2;
pair < int, int > sp, fp;
int dmin[DM][DM], xpath[DM][DM];
int di[4] = {0, 1, 0, -1};
int dj[4] = {1, 0, -1, 0};

bool inside(int i, int j) {
    return(i >= 1 && i <= r && j >= 1 && j <= c);
}

void putzero() {
    for(int i = 1; i <= r; i++) {
        for(int j = 1; j <= c; j++) {
            xpath[i][j] = 0;
        }
    }
}

bool verifbin(int x) {
    lee2.push(make_pair(sp.first, sp.second));
    
    while(!lee2.empty()) {
        int nodi = lee2.front().first;
        int nodj = lee2.front().second;
        lee2.pop();
        
        for(int i = 0; i < 4; i++) {
            int newi = nodi + di[i];
            int newj = nodj + dj[i];
            
            if(inside(newi, newj) && mat[newi][newj] != '*' && !xpath[newi][newj] && dmin[newi][newj] >= x) {
                xpath[newi][newj] = xpath[nodi][nodj] + 1;
                lee2.push(make_pair(newi, newj));
            }
            
        }
        
    }
    
    if(xpath[fp.first][fp.second] >= x)
        return true;
    
    return false;
}

int bin() {
    int lo = -1, hi = r * c, mid;
    
    while(lo <= hi) {
        mid = (lo + hi) / 2;
        if(verifbin(mid)) {
            lo = mid + 1;
        } else {
            hi = mid - 1;
        }
        
        putzero();
    }
    
    if(verifbin(hi))
        return hi;
    
    return -1;
}

int main() {
    fin >> r >> c;
    fin.get();
    for(int i = 1; i <= r; i++)
        fin.getline(mat[i] + 1, DM);
    
    
    for(int i = 1; i <= r; i++) {
        for(int j = 1; j <= c; j++) {
            if(mat[i][j] == 'I') {
                sp.first = i;
                sp.second = j;
            } else if(mat[i][j] == 'O') {
                fp.first = i;
                fp.second = j;
            } else if(mat[i][j] == 'D')
                lee1.push(make_pair(i, j));
            
        }
    }
    
    while(!lee1.empty()) {
        int nodi = lee1.front().first;
        int nodj = lee1.front().second;
        lee1.pop();
        
        for(int i = 0; i < 4; i++) {
            int newi = nodi + di[i];
            int newj = nodj + dj[i];
            
            if(inside(newi, newj) && mat[newi][newj] != '*' && mat[newi][newj] != 'D' && !dmin[newi][newj]) {
                dmin[newi][newj] = dmin[nodi][nodj] + 1;
                lee1.push(make_pair(newi, newj));
            }
            
        }
        
    }
    
    int rez = bin();
    
    if(verifbin(rez))
        fout << rez;
    else
       fout << "-1";
    
}