Cod sursa(job #2468627)

Utilizator bluestorm57Vasile T bluestorm57 Data 5 octombrie 2019 18:24:00
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.38 kb
#include <bits/stdc++.h>

using namespace std;

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

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

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

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'){
                        dragon[i][j + 1] = 1;
                        d.push_back(make_pair(i,j + 1));
                    }else
                        if(s[j] == '*')
                            mat[i][j + 1] = 1;
    }

    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)){
                if(!dragon[nx][ny]){
                    dragon[nx][ny] = dragon[x][y] + 1;
                    d.push_back(make_pair(nx,ny));
                }
            }
        }
    }

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

    int lo = 0, hi = n * m * 2, mid;

        mid = 1;

        for(i = 1 ; i <= n ; i++)
            for(j = 1 ; j <= m ; j++)
                viz[i][j] = 0;
        d.clear();
        d.push_back(start);
        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)){
                    if(!viz[nx][ny] && dragon[nx][ny] >= mid && !mat[nx][ny]){
                        viz[nx][ny] = 1;
                        d.push_back(make_pair(nx,ny));
                    }
                }
            }

        }
        if(!viz[stop.first][stop.second]){
            g << -1;
            return 0;
        }

    ans = inf;
    while(lo <= hi){
        mid = (lo + hi) / 2;

        for(i = 1 ; i <= n ; i++)
            for(j = 1 ; j <= m ; j++)
                viz[i][j] = 0;
        d.clear();
        d.push_back(start);
        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)){
                    if(!viz[nx][ny] && dragon[nx][ny] >= mid && !mat[nx][ny]){
                        viz[nx][ny] = 1;
                        d.push_back(make_pair(nx,ny));
                    }
                }
            }

        }

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

    }
    if(ans != inf)
        g << ans;
    else
        g << -1;

    return 0;
}