Cod sursa(job #3238554)

Utilizator Minea_TheodorMinea Theodor Stefan Minea_Theodor Data 26 iulie 2024 16:02:05
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <bits/stdc++.h>

using namespace std;


ifstream fin("barbar.in");
ofstream fout("barbar.out");

int n, m, d[1005][1005];

char a[1005][1005];
queue<pair <int, int>> q;
bitset <1005> v[1005];

int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };
pair <int, int> start, finish;


void read()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        for(int j=1; j <= m; j++)
            fin >> a[i][j];
    }
}


void Bordare()
{
    for (int i = 0; i <= n + 1; i++)
        a[i][0] = a[i][m + 1] = '*';
    for (int j = 0; j <= m + 1; j++)
        a[0][j] = a[n+1][j] = '*';
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            d[i][j] = INT_MAX;
}


void Lee()
{
    while(!q.empty())
    {
        int i, j;
        i = q.front().first;
        j = q.front().second;
        q.pop();
        for (int k=0; k < 4; k++)
        {
            int x=i+dx[k];
            int y=j + dy[k];
            if (a[x][y] != '*' && d[x][y] > d[i][j] + 1)
            {
                d[x][y] = d[i][j] + 1;
                q.push({x, y});
            }
        }
    }
}

void Fill(int i, int j, int val)
{
    v[i][j]=1;
    for (int k = 0; k < 4; k++)
    {
        int x = i + dx[k];
        int y = j + dy[k];
        if (a[x][y] != '*' && v[x][y] == 0 && d[x][y] >= val)
            Fill (x, y, val);
    }
}

int BinSearch()
{
    int left, right, mid, maxval = -1;
    left = 0;
    right = min(d[start.first][start.second], d[finish.first][finish.second]);
    while (left <= right)
    {
        int mid = (left + right)/2;
        Fill(start.first, start.second, mid);
        if (v[finish.first][finish.second] == 1)
        {
            maxval = mid;
            left = mid + 1;
        }
        else right = mid - 1;
        for (int i = 1; i <= n; i++)
            v[i].reset();
    }
    return maxval;
}

void solve()
{
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            if (a[i][j] == 'D')
            {
                q.push({ i, j });
                d[i][j] = 0;
            }
            else if (a[i][j] == 'I')
                start = { i, j };
            else if (a[i][j] == 'O')
            finish = { i, j };
        }
    Lee();
    cout << BinSearch() << '\n';
}


int main()
{
    read();
    Bordare();
    solve();
    return 0;
}