Cod sursa(job #2553176)

Utilizator marius004scarlat marius marius004 Data 21 februarie 2020 18:29:56
Problema Barbar Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <iostream>
#include <fstream>
#include <queue>
 
std::ifstream f("barbar.in");
std::ofstream g("barbar.out");
 
const int NMAX = 1005;
const int dx[] = { 1 , -1 , 0 , 0 };
const int dy[] = { 0 , 0 , 1 , -1 };
 
int n,m,cost[NMAX][NMAX],maxx;
char a[NMAX][NMAX];
bool vis[NMAX][NMAX];
std::queue< std::pair<int,int> >Q;
std::pair<int,int>coordonates,destination;
 
bool isValid(int i,int j){
    return i >= 1 && i <= n && j >= 1 && j <= m;
}
 
bool lee(int mid){
 
    while(!Q.empty())
        Q.pop();
 
    for(int i = 1;i <= n;++i)
        for(int j = 1;j <= m;++j)
            vis[i][j] = false;
 
    vis[coordonates.first][coordonates.second] = true;
    Q.push(coordonates);
 
    while(!Q.empty()){
 
        int i = Q.front().first;
        int j = Q.front().second;
        Q.pop();
 
        for(int dir = 0;dir < 4;++dir){
 
            int next_i = i + dx[dir];
            int next_j = j + dy[dir];
 
            if(isValid(next_i,next_j) && !vis[next_i][next_j] &&
               a[next_i][next_j] != '*' && cost[next_i][next_j] > mid){
                    if(destination.first == next_i && destination.second == next_j)
                        return true;
                    vis[next_i][next_j] = true;
                    Q.push({next_i,next_j});
            }
        }
    }
 
    return false;
}
 
int main(){
 
    f >> n >> m;
 
    for(int i = 1;i <= n;++i){
        for(int j = 1;j <= m;++j){
            f >> a[i][j];
            if(a[i][j] == 'D'){
                Q.push({i,j});
                cost[i][j] = 1;
            }else if(a[i][j] == 'I')
                coordonates = {i,j};
            else if(a[i][j] == 'O')
                destination = {i,j};
        }
    }
 
    while(!Q.empty()){
 
        int i = Q.front().first;
        int j = Q.front().second;
        Q.pop();
 
        for(int dir = 0;dir < 4;++dir){
 
            int next_i = i + dx[dir];
            int next_j = j + dy[dir];
 
            if(isValid(next_i,next_j) && a[next_i][next_j] != '*'
                && cost[next_i][next_j] == 0){
                    cost[next_i][next_j] = 1 + cost[i][j];
                    Q.push({next_i,next_j});
                }
        }
    }
 
    for(int i = 1;i <= n;++i)
        for(int j = 1;j <= m;++j)
            maxx = std::max(cost[i][j],maxx);
 
    int left = 1;
    int right = maxx;
    int sol = -1;
 
    while(left <= right){
 
        int mid = (left + right) / 2;
 
        if(lee(mid)){
            left = mid + 1;
            sol = mid;
        }else{
            right = mid - 1;
        }
    }
 
    g << 1;
 
    return 0;
}