Cod sursa(job #2033402)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 6 octombrie 2017 19:22:23
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#define DM 1001
#include <cstring>
#include <fstream>
#include <queue>
using namespace std;

ifstream fi("barbar.in");
ofstream fo("barbar.out");
char c[DM][DM];
int di[] = {-1, 0, 1, 0}, dj[] = {0, 1, 0, -1};
int n, m, a, b, si, sj, ei, ej, dist[DM][DM], viz[DM][DM];
queue <pair <int, int> > q;

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


bool bfs(int t[DM][DM], int x)
{
    while (!q.empty())
    {
        a = q.front().first, b = q.front().second;
        q.pop();
        for (int i = 0; i < 4; ++i)
            if (ok(a + di[i], b + dj[i]) && dist[a+di[i]][b+dj[i]] >= x && c[a+di[i]][b+dj[i]] != '*' && !t[a+di[i]][b+dj[i]])
            {
                t[a+di[i]][b+dj[i]] = t[a][b] + 1;
                q.push({a + di[i], b + dj[i]});
            }
    }
    if (!t[ei][ej])
        return 0;
    return 1;
}

int binar()
{
    int lo = 1, hi = dist[si][sj], mid;
    while (hi > lo)
    {
        mid = (lo + hi + 1)/2;
        for (int i = 1; i <= n; ++i)
            memset(viz[i], 0, DM);
        q.push({si, sj});
        viz[si][sj] = 1;
        if (mid <= dist[si][sj] && bfs(viz, mid))
            lo = mid;
        else
            hi = mid - 1;
    }
    return lo;
}

int main()
{
    fi >> n >> m;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
        {
            fi >> c[i][j];
            if (c[i][j] == 'D')
            {
                q.push({i, j});
                dist[i][j] = 1;
            }
            if (c[i][j] == 'I')
                si = i, sj = j;
            if (c[i][j] == 'O')
                ei = i, ej = j;
        }
    bfs(dist, 0);
    q.push({si, sj});
    viz[si][sj] = 1;
    if (!bfs(viz, 1))
    {
        fo << -1;
        return 0;
    }
    fo << binar() - 1;
    return 0;
}