Cod sursa(job #3242543)

Utilizator matei0000Neacsu Matei matei0000 Data 12 septembrie 2024 16:28:38
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>

using namespace std;

using pii = pair<int, int>;
#define fr first
#define sc second
#define pb push_back
#define pf push_front


bool fct(int dst, vector<int> &dist, vector<vector<int>> &vec, int in, int out)
{
    if(dist[in] < dst || dist[out] < dst)
        return false;
    queue<int> bfs;
    vector<bool> f(vec.size(), false);
    bfs.push(in);
    while(!bfs.empty())
    {
        int nod = bfs.front();
        bfs.pop();
        for(auto i : vec[nod])
            if(!f[i] && dist[i] >= dst)
                f[i] = true, bfs.push(i);
    }
    return f[out];
}

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

    int r, c, in, out;
    cin >> r >> c;

    vector<char> mat(r * c);
    vector<vector<int>> vec(r * c);
    vector<int> dist(r * c, 1e9);
    queue<int> bfs;
    vector<bool> f(r * c);

    for(int i = 0; i < r; i ++)
        for(int j = 0; j < c; j ++)
        {
            int pos = i * c + j;
            char ch;
            cin >> ch;
            mat[pos] = ch;
            if(ch == 'D')
                dist[pos] = 0, bfs.push(pos), f[pos] = true;
            if(ch == 'I')
                in = pos;
            if(ch == 'O')
                out = pos;
            if(ch != '*' && j > 0 && mat[pos - 1] != '*')
                vec[pos - 1].push_back(pos), vec[pos].push_back(pos - 1);
            if(ch != '*' && i > 0 && mat[pos - c] != '*')
                vec[pos - c].push_back(pos), vec[pos].push_back(pos - c);
        }

    while(!bfs.empty())
    {
        int nod = bfs.front();
        bfs.pop();
        for(auto i : vec[nod])
            if(!f[i])
                dist[i] = dist[nod] + 1, f[i] = true, bfs.push(i);
    }

    int pas = 1024, pos = 0;
    while(pas)
    {
        if(fct(pos + pas, dist, vec, in, out))
            pos += pas;
        pas /= 2;
    }
    cout << pos;
}