Cod sursa(job #2707064)

Utilizator crismariuCrismariu Codrin crismariu Data 16 februarie 2021 13:55:49
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.79 kb
#include <bits/stdc++.h>
//#pragma GCC optimize("O3")
#define test " test "
#define ll long long
#define pii pair<int, int>
#define FASTIO   \
    cin.tie(0);  \
    cout.tie(0); \
    ios_base::sync_with_stdio(0);
#define FILES                      \
    freopen("barbar.in", "r", stdin); \
    freopen("barbar.out", "w", stdout);
#define testcase             \
    int T;    \
    cin >> T; \
    while (T--)
#define vec vector<int>
using namespace std;

char c[1001][1001];
vector<pii> D;
pii start, finish;
int n, m, dx[] = {0, -1, 0, 1}, dy[] = {-1, 0, 1, 0};

bool lee(int mid)
{
    vector<vector<bool>> alt;
    alt.resize(n + 1, vector<bool>(m + 1));
    for(int i = 0; i < D.size(); i++)
    {
        int x = D[i].first, y = D[i].second;
        for(int k = 0; k <= mid - 1; k++)
        {
            int i = k, j = mid - k - 1;
            if(x + i > 0 && x + i <= n && y + j > 0 && y + j <= m)
                alt[x + i][y + j] = 1;

            i = -k, j = mid - k - 1;
            if(x + i > 0 && x + i <= n && y + j > 0 && y + j <= m)
                alt[x + i][y + j] = 1;

            i = k, j = -(mid - k - 1);
            if(x + i > 0 && x + i <= n && y + j > 0 && y + j <= m)
                alt[x + i][y + j] = 1;

            i = -k, j = -(mid - k - 1);
            if(x + i > 0 && x + i <= n && y + j > 0 && y + j <= m)
                alt[x + i][y + j] = 1;
        }
        if(alt[start.first][start.second]||alt[finish.first][finish.second])
            return 0;
    }
    queue <pii> q;
    q.push(start);
    while(!q.empty())
    {
        int x = q.front().first, y = q.front().second;
        q.pop();
        for(int i = 0; i < 4; i++)
            if(x + dx[i] > 0 && x + dx[i] <= n && y + dy[i] > 0 && y + dy[i] <= m)
                if(!alt[x + dx[i]][y + dy[i]] && c[x + dx[i]][y + dy[i]] != '*')
                {
                    if(make_pair(x + dx[i], y + dy[i]) == finish)
                        return 1;
                    else
                    {
                        alt[x + dx[i]][y + dy[i]] = 1;
                        q.push({x + dx[i], y + dy[i]});
                    }
                }
    }
    return 0;
}

signed main()
{
    FASTIO FILES
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            cin >> c[i][j];
            if(c[i][j] == 'D')
                D.push_back({i, j});
            else if(c[i][j] == 'I')
                start = {i, j};
            else if(c[i][j] == 'O')
                finish = {i, j};

        }
    int l = 0, r = min(n, m);
    while(l < r - 1)
    {
        int mid = (l + r) / 2;
        if(lee(mid))
            l = mid;
        else
            r = mid;
    }
    cout << l;
    return 0;
}