Cod sursa(job #2971476)

Utilizator Nitoi_BogdanNitoi Andrei-Bogdan Nitoi_Bogdan Data 27 ianuarie 2023 14:18:46
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <fstream>
#include <queue>
#include <cstring>

using namespace std;

int n, m, d[1001][1001], x, y, xi, yi, sol;
char s;
short int a[1001][1001];
bool viz[1001][1001];

ifstream cin ("barbar.in");
ofstream cout ("barbar.out");

struct coada
{
    int l, c;
};

int del(int i, int j)
{
    return i>=1 && i<=n && j>=1 && j<=m;
}

queue <coada> q;

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

int lee(int k)
{
    memset(viz, 0, sizeof(viz));
    if(d[x][y] >= k)
    {
        q.push({x,y});
        viz[x][y] = 1;
    }
    else
        return 0;
    while(!q.empty())
    {
        int l = q.front().l;
        int c = q.front().c;
        q.pop();
        for(int i = 1; i<=4; i++)
        {
            int ii = l + dx[i];
            int jj = c + dy[i];
            if(del(ii,jj) && a[ii][jj] == 0 && viz[ii][jj] == 0 && d[ii][jj] > k)
            {
                viz[ii][jj] = 1;
                q.push({ii,jj});
            }
        }
    }
    return viz[xi][yi];
}

int main()
{
    cin >> n >> m;
    for(int i = 1; i<=n; i++)
    {
        for(int j = 1; j<=m; j++)
        {
            cin >> s;
            if(s == 'I')
            {
                x = i, y = j;
            }
            else
                if(s == '*')
            {
                a[i][j] = 1;
            }
            else
                if(s == 'D')
            {
                a[i][j] = 2;
                q.push({i,j});
                d[i][j] = 1;
            }
            else
                if(s == 'O')
            {
                xi = i,yi = j;
            }
        }
    }

    while(!q.empty())
    {
        int l = q.front().l;
        int c = q.front().c;
        q.pop();
        for(int i = 1; i<=4; i++)
        {
            int ii = l + dx[i];
            int jj = c + dy[i];
            if(del(ii,jj) && a[ii][jj] == 0 && d[ii][jj] == 0)
            {
                d[ii][jj] = d[l][c] + 1;
                q.push({ii,jj});
            }
        }
    }


    int st = 0, dr  = n * m;

    while(st <= dr)
    {
        int mid = (dr + st) / 2;
        int ok = lee(mid);
        if(ok == 1)
        {
            sol = mid;
            st = mid + 1;
        }
        else
        {
            dr = mid - 1;
        }
    }

    cout << sol;

    return 0;
}