Cod sursa(job #1736801)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 2 august 2016 17:04:55
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <queue>

using namespace std;
#define llu long long unsigned
#define ll long long
#define pb push_back
#define mp make_pair

const int N = 1005;
char h[N][N];
int danger[N][N], xS, yS, xF, yF;
bool viz[N][N];
queue < pair<int, int> > q;
int d[4][2] = {
    {-1, 0}, {1, 0}, {0, -1}, {0, 1}
};

void go(int i, int j, int xx){
    int x, y, k;
    viz[i][j] = 1;
    for(k = 0;k < 4;k++){
        x = i + d[k][0];
        y = j + d[k][1];
        if(h[x][y] != '*' && danger[x][y] >= xx && viz[x][y] == 0){
            go(x, y, xx);
        }
    }
}

void reset(int n, int m){
    int i,j;
    for(i = 1;i <= n;i++){
        for(j = 1;j <= m;j++){
            viz[i][j] = 0;
        }
    }
}

int main(){
    int n, m, i, j, x, y, nx, ny;
    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(i = 1;i <= n;i++){
        scanf("%s", h[i]+1);
    }
    for(i = 0;i <= n+1;i++){
        h[i][0] = h[i][m+1] = '*';
    }
    for(i = 0;i <= m+1;i++){
        h[0][i] = h[n+1][i] = '*';
    }
    for(i = 1;i <= n;i++){
        for(j = 1;j <= m;j++){
            danger[i][j] = -1;
            if(h[i][j] == 'D'){
                q.push({i, j});
                danger[i][j] = 0;
            }else if(h[i][j] == 'I'){
                xS = i;
                yS = j;
            }else if(h[i][j] == 'O'){
                xF = i;
                yF = j;
            }
        }
    }
    while(q.empty() == false){
        x = q.front().first;
        y = q.front().second;
        q.pop();
        for(i = 0;i < 4;i++){
            nx = x + d[i][0];
            ny = y + d[i][1];
            if(danger[nx][ny] == -1 && h[nx][ny] != '*'){
                danger[nx][ny] = danger[x][y] + 1;
                q.push({nx, ny});
            }
        }
    }
    int mx = -1;
    int lf,mid,rg;
    lf = 1;
    rg = n+m+1;
    while(lf <= rg){
        mid = (lf+rg)/2;
        if(danger[xS][yS] >= mid){
            go(xS, yS, mid);
        }
        if(viz[xF][yF] == 1){
            mx = mid;
            lf = mid+1;
        }else{
            rg = mid-1;
        }
        reset(n, m);
    }
    printf("%d",mx);
    return 0;
}