Cod sursa(job #2971480)

Utilizator dragos1102Dragos Vieru dragos1102 Data 27 ianuarie 2023 14:22:58
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>

using namespace std;

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

int n, m, d[1001][1001], xi, yi, xf, yf;
short int mat[1001][1010];
bool viz[1001][1001];
int dy[] = {0, 1, 0, -1}, dx[] = {-1, 0, 1, 0};

struct punct
{
    int l, c;
};
queue <punct> q;

int lee(int k)
{
    memset(viz, 0, sizeof(viz));
    if(d[xi][yi] > k)
    {
        q.push({xi, yi});
        viz[xi][yi] = 1;
    }
    else
        return 0;

    while(!q.empty())
    {
        int l = q.front().l;
        int c = q.front().c;
        q.pop();
        for(int i = 0; i <= 3; i++)
        {
            int lv = l + dx[i];
            int cv = c + dy[i];
            if(lv >= 1 && lv <= n && cv >= 1 && cv <= m)
            {
                if(mat[lv][cv] == 0 && viz[lv][cv] == 0 && d[lv][cv] > k)
                {
                    viz[lv][cv] = 1;
                    q.push({lv, cv});
                }
            }
        }
    }
    return viz[xf][yf];
}

int main()
{
    fin >> n >> m;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            char ch;
            fin >> ch;
            if(ch == 'D')
            {
                mat[i][j] = 2;
                q.push({i, j});
                d[i][j] = 1;
            }
            else if(ch == '*')
                mat[i][j] = 1;
            else if(ch == 'I')
            {
                xi = i;
                yi = j;
            }
            else if(ch == 'O')
            {
                xf = i;
                yf = j;
            }
        }

    while(!q.empty())
    {
        int l = q.front().l;
        int c = q.front().c;
        q.pop();
        for(int i=0; i<=3; i++)
        {
            int lv = l + dx[i];
            int cv = c + dy[i];
            if(lv >= 1 && lv <= n && cv >= 1 && cv <= m)
            {
                if(mat[lv][cv] == 0 && d[lv][cv] == 0)
                {
                    d[lv][cv] = d[l][c] + 1;
                    q.push({lv, cv});
                }
            }
        }
    }

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

    fout << sol;

    return 0;
}