Cod sursa(job #2971255)

Utilizator Luka77Anastase Luca George Luka77 Data 26 ianuarie 2023 21:37:12
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.07 kb
#include <bits/stdc++.h>
#define FOR(WHATEVER) for(int i = 1; i <= WHATEVER; ++ i)
using namespace std;

/// INPUT / OUTPUT
const string problem = "barbar";
ifstream fin(problem + ".in");
ofstream fout(problem + ".out");

/// GLOBAL VARIABLES
const int NMAX = 1005, MOD = 1e9 + 7, INF = 1e9;
bool viz[NMAX][NMAX];
char mat[NMAX][NMAX];
int n, m, sx, sy, fx, fy;
int dx[] = {0, 0, -1, 1}, dy[] = {1, -1, 0, 0};
int dist[NMAX][NMAX];
queue<pair<int,int>>dragoni;

inline bool InMat(const int &x, const int &y)
{
    return x >= 1 && x <= n && y >= 1 && y <= m && !viz[x][y];
}

inline void bfs()
{
    while(!dragoni.empty())
    {
        int x = dragoni.front().first;
        int y = dragoni.front().second;
        dragoni.pop();
        for(int d = 0; d <= 3; ++ d)
        {
            int newx = dx[d] + x;
            int newy = dy[d] + y;
            if(InMat(newx,newy))
            {
                dist[newx][newy] = dist[x][y] + 1;
                viz[newx][newy] = 1;
                dragoni.push({newx,newy});
            }
        }
    }
}

inline int lee(int val)
{
    memset(viz, 0, sizeof(viz));
    queue<pair<int,int>>q;
    //cout << sx << ' ' << sy << '\n';
    q.push({sx, sy});
    while(!q.empty())
    {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        for(int d = 0; d <= 3; ++ d)
        {
            int newx = dx[d] + x;
            int newy = dy[d] + y;
            if(InMat(newx,newy) && dist[newx][newy] >= val && mat[newx][newy] != '*')
            {
                viz[newx][newy] = 1;
                q.push({newx,newy});
            }
        }
    }
    for(int i = 1; i <= n; ++ i)
    {
        for(int j = 1; j <= m; ++ j)
        {
            //cout << viz[i][j] << ' ';
        }
        //cout << '\n';
    }
    return viz[fx][fy];
}

/// SOLUTION
inline void solution()
{
    for(int i = 1; i <= n; ++ i)
    {
        for(int j = 1; j <= m; ++ j)
        {
            if(mat[i][j] == 'D')
                dragoni.push({i, j}), viz[i][j] = 1;
            if(mat[i][j] == 'I')
                sx = i, sy = j;
            if(mat[i][j] == 'O')
                fx = i, fy = j;
        }
    }
    bfs();
    int dr = INT_MIN, st = 0, ans = 0;
    for(int i = 1; i <= n; ++ i)
    {
        for(int j = 1; j <= m; ++ j)
        {
            dr = max(dr, dist[i][j]);
        }
    }
    while(st <= dr)
    {
        int mid = (st + dr) / 2;
        if(lee(mid))
        {
            //cout << "DA";
            st = mid + 1;
            ans = max(ans, mid);
        }
        else
        {
            //cout << "NU";
            dr = mid - 1;
        }
    }
    if(lee(0) == 0)
        fout << -1;
    else
        fout << ans;
}

/// READING THE INPUT
int main()
{
    ios::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    fin >> n >> m;

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

    solution();
}