Cod sursa(job #2032754)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 5 octombrie 2017 17:29:03
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 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 n, m, dist[DM][DM], a, b, di[4] = {-1, 0, 1, 0}, dj[4] = {0, 1, 0, -1}, viz[DM][DM], endi, endj;
queue <pair <int, int> > q;
pair <int, int> v;
 
int ok(int x, int y){
    return(x > 0 && y > 0 && x <= n && y <= m);
}
 
int bfs(int x)
{
    for (int i = 1; i <= n; ++i)
        memset(viz[i], 0, m + 1);
    q.push(v);
    viz[v.first][v.second] = dist[v.first][v.second];
    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]) && (c[a+di[i]][b+dj[i]] == '.' || c[a+di[i]][b+dj[i]] == 'O') && (!viz[a+di[i]][b+dj[i]] || viz[a+di[i]][b+dj[i]] > viz[a][b]) && dist[a+di[i]][b+dj[i]] >= x)
            {
                viz[a+di[i]][b+dj[i]] = min(dist[a+di[i]][b+dj[i]], viz[a][b]);
                q.push({a + di[i], b + dj[i]});
            }
    }
    if (viz[endi][endj])
        return 1;
    return 0;
}
 
int binar()
{
    int hi = n + m, lo = 1, mid;
    while (hi > lo)
    {
        mid = (lo + hi + 1)/2;
        if (bfs(mid))
            lo = mid;
        else
            hi = mid - 1;
    }
    return mid;
}
 
int main()
{
    fi >> n >> m;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
        {
            dist[i][j] = (1<<30);
            fi >> c[i][j];
            if (c[i][j] == 'D')
            {
                dist[i][j] = 0;
                q.push({i, j});
            }
            else if (c[i][j] == 'I')
                v = {i, j};
            else if (c[i][j] == 'O')
                endi = i, endj = j;
        }
    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]] > dist[a][b] + 1 && c[a+di[i]][b+dj[i]] != '*')
            {
                dist[a+di[i]][b+dj[i]] = dist[a][b] + 1;
                q.push({a + di[i], b + dj[i]}); 
            }
    }
    fo << binar();
    return 0;
}