Cod sursa(job #2468402)

Utilizator bluestorm57Vasile T bluestorm57 Data 5 octombrie 2019 15:11:40
Problema Barbar Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.56 kb
//wish me luck
#include <bits/stdc++.h>

using namespace std;

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

const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, -1, 0, 1};
const int NMAX = 1005;
const int inf = 1e9;
pair <int, int> start, stop;
int n,m,dragon[NMAX][NMAX],mat[NMAX][NMAX];
bool viz[NMAX][NMAX];
string s;
deque < pair <int, int> > d;

bool inside(int x, int y){
    return (x >= 1 && y >= 1 && x <= n && y <= m);
}

void bfs(){
    int x,y,nx,ny,i;
    while(!d.empty()){
        x = d.front().first;
        y = d.front().second;
        d.pop_front();

        for(i = 0 ; i < 4 ; i++){
            nx = x + dx[i];
            ny = y + dy[i];

            if(inside(nx, ny) && !dragon[nx][ny]){
                dragon[nx][ny] = dragon[x][y] + 1;
                d.push_back(make_pair(nx,ny));
            }
        }

    }
}

int main(){
    int i,j,x,y,nx,ny;
    f >> n >> m;
    for(i = 1 ; i <= n ; i++){
        f >> s;
        for(j = 0 ; j < m ; j++)
            if(s[j] == 'I')
                start = make_pair(i,j + 1);
            else
                if(s[j] == 'O')
                    stop = make_pair(i,j + 1);
                else
                    if(s[j] == 'D'){
                        d.push_back(make_pair(i,j + 1));
                        dragon[i][j + 1] = 1;
                    }else
                        if(s[j] == '*'){
                            mat[i][j + 1] = -1;
                        }
    }

    bfs();

    for(i = 1 ; i <= n ; i++)
        for(j = 1 ; j <= m ; j++)
            dragon[i][j]--;


    int lo = 1, hi = 2 * inf, mid,ans = inf ;
    while(lo <= hi){
        d.push_back(start);
        mid = (lo + hi) / 2;
        while(!d.empty() && !viz[stop.first][stop.second]){
            x = d.front().first;
            y = d.front().second;
            d.pop_front();

            for(i = 0 ; i < 4 ; i++){
                nx = x + dx[i];
                ny = y + dy[i];

                if(inside(nx,ny) && !viz[nx][ny] && dragon[nx][ny] >= mid && mat[nx][ny] != -1){
                    viz[nx][ny] = 1;
                    d.push_back(make_pair(nx,ny));
                }
            }
        }

        if(viz[stop.first][stop.second]){
            lo = mid + 1;
            ans = mid;
        }else
            hi = mid - 1;

        for(i = 1 ; i <= n ; i++)
            for(j = 1 ; j <= m ; j++)
                viz[i][j] = 0;

    }
    if(ans != inf || ans > m * n)
        g << ans;
    else
        g << -1;
    return 0;
}