Cod sursa(job #1849541)

Utilizator SmarandaMaria Pandele Smaranda Data 17 ianuarie 2017 17:35:39
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <ctime>
#include <utility>
#include <string.h>

#define x first
#define y second

using namespace std;

const int N = 1005;
int dx [4] = {1, 0, -1,  0};
int dy [4] = {0, 1,  0, -1};

int n, m, d [N][N];
char s [N][N];
bool used[N][N];

queue < pair<int, int> > q;
pair<int, int> source, dest;

bool check(int minnow){
    int i, xn, yn;
    pair <int, int> nod;

    while(!q.empty())
        q.pop();
    if(d[source.x][source.y] < minnow)
        return false;
    memset(used, false, sizeof(used));
    q.push(source);
    while (!q.empty())
    {
        nod = q.front();
        if(nod == dest)
            return true;
        for(i = 0; i < 4; ++i) {
            xn= nod.x + dx [i];
            yn = nod.y + dy [i];
            if(xn >= 1 && yn >= 1 && xn <= n && yn <= m && d [xn][yn] >= minnow && !used [xn][yn] && s [xn][yn] != '*')
            {
                used [xn][yn] = true;
                q.push(make_pair(xn, yn));
            }
        }
        q.pop();
    }
    return false;
}

int binarySearch(int st, int dr){
    int mij, last = 0;
    while (st <= dr){
        mij = (st + dr) / 2;
        if(check(mij))
        {
            last = mij;
            st = mij + 1;
        }
        else dr = mij - 1;
    }
    return last;
}

void bfs(){
    int xn, yn, i;
    pair <int, int> nod;

    while (!q.empty()){
        nod = q.front();
        q.pop();
        for(i = 0; i < 4; ++i) {
            xn = nod.x + dx[i];
            yn = nod.y + dy[i];
            if(xn >= 1 && yn >= 1 && xn <= n && yn <= m && !d [xn][yn] && s [xn][yn] != '*')
            {
                d [xn][yn] = d[nod.x][nod.y] + 1;
                q.push(make_pair(xn, yn));
            }
        }
    }
}

int main() {
    int i, j, ans;

    freopen ("barbar.in", "r", stdin);
    freopen ("barbar.out", "w", stdout);

    scanf("%d%d\n", &n, &m);
    for (i = 1; i <= n; ++i){
        scanf ("%s", s[i] + 1);
        for(j = 1; j <= m; ++j)
            switch(s[i][j])
            {
                case('I'):{
                    source.x = i;
                    source.y = j;
                    break;
                }
                case('O'):{
                    dest.x = i;
                    dest.y = j;
                    break;
                }
                case('D'):{
                    d[i][j] = 1;
                    q.push(make_pair(i, j));
                    break;
                }
            }
    }
    bfs();
    ans = binarySearch(0, n + m) - 1;
    printf("%d\n", ans);
    return 0;
}