Cod sursa(job #2553171)

Utilizator marius004scarlat marius marius004 Data 21 februarie 2020 18:20:35
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 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 && a[next_i][next_j] != 'D'){
                    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);
 
    for(int i = maxx;i >= 1;--i){
        
        if(lee(i)){
            g << i;
            return 0;
        }
    }
    
    g << -1;
 
    return 0;
}