Cod sursa(job #3242549)

Utilizator TudorMMPopescu Tudor Mihai TudorMM Data 12 septembrie 2024 16:32:27
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <bits/stdc++.h>
///#define int long long

using namespace std;
#define cin in
#define cout out
ifstream in ("barbar.in");
ofstream out ("barbar.out");
#define f first
#define s second

#define inf 100000008
int n, m, sx, sy, fx, fy;
const int maxN=1008;
int grid[maxN][maxN];
vector <pair <int, int>> dragoni;
int dist[maxN][maxN];

int dx[]={0, 0, -1, 1};
int dy[]={-1, 1, 0, 0};

bool check(int x, int y)
{
    return (x>=1 && y>=1 && x<=n && y<=m && grid[x][y]==0);
}

void bfs()
{
    queue <pair <int, int>> q;
    for (int i=1; i<=n; i++)
            for (int j=1; j<=m; j++) dist[i][j]=inf;
    for (auto x:dragoni) {q.push(x); dist[x.f][x.s]=0;}

    while (!q.empty())
    {
        int x=q.front().first;
        int y=q.front().second;
        q.pop();

        for (int i=0; i<4; i++)
        {
            int nx=x+dx[i]; int ny=y+dy[i];
            if (!check(nx, ny) || dist[nx][ny]<=dist[x][y]+1) continue;

            dist[nx][ny]=dist[x][y]+1;
            q.push({nx, ny});
        }
    }
}

bool vis[maxN][maxN];
int aux;
void dfs(int x, int y)
{
    vis[x][y]=true;

    for (int i=0; i<4; i++)
    {
        int nx=x+dx[i]; int ny=y+dy[i];
        if (!check(nx, ny) || dist[nx][ny]<aux || vis[nx][ny]) continue;

        dfs(nx, ny);
    }
}

signed main()
{
    cin>>n>>m;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
        {
            char c; cin>>c;

            if (c=='.' || c=='I' || c=='O') grid[i][j]=0;
            if (c=='*' || c=='D') grid[i][j]=1;
            if (c=='D') dragoni.push_back({i, j});
            if (c=='I') {sx=i; sy=j;}
            if (c=='O') {fx=i; fy=j;}
        }

    bfs();

    int le=0, ri=inf;
    while (le<ri)
    {
        int mid=le+(ri-le+1)/2;

        aux=mid;
        for (int i=1; i<=n; i++)
            for (int j=1; j<=m; j++)
                vis[i][j]=false;
        dfs(sx, sy);

        if (vis[fx][fy]) le=mid;
        else ri=mid-1;
    }

    cout<<(le==0 ? -1 : le);

    return 0;
}