Cod sursa(job #2867953)

Utilizator Giurgea_AlexandruGiurgea Alexandru Giurgea_Alexandru Data 10 martie 2022 17:26:58
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <fstream>
#include <vector>
#include <queue>
#include <utility>

using namespace std;

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

int main()
{
    int r=0,c=0;
    fin>>r>>c;
    vector<vector<int>> mb(r,vector<int>(c,true));
    vector<vector<int>> m(r,vector<int>(c,r*c+1));
    vector<pair<int,int>> rvs={make_pair(0,-1),make_pair(0,1),make_pair(-1,0),make_pair(1,0)};
    pair<int,int> I(-1,-1),O(-1,-1);
    queue<pair<int,int>> ds;
    for(int i=0;i<r;i++) {
        for(int j=0;j<c;j++) {
            char c='0';
            fin>>c;
            if(c=='*') {
                m[i][j]=-1;
            }
            else {
                if(c=='D') {
                    ds.push(make_pair(i,j));
                    m[i][j]=0;
                }
                else {
                    if(c=='I') {
                        I.first=i;
                        I.second=j;
                    }
                    else if(c=='O') {
                        O.first=i;
                        O.second=j;
                    }
                }
            }
        }
    }

    while(!ds.empty()) {
        pair<int,int> pos(ds.front().first,ds.front().second);
        for(auto rv:rvs) {
            pair<int,int> av(pos.first,pos.second);
            av.first+=rv.first;
            av.second+=rv.second;
            if(av.first>=0&&av.second>=0&&av.first<r&&av.second<c) {
                if(m[av.first][av.second]!=-1&&mb[av.first][av.second]) {
                    m[av.first][av.second]=min(m[av.first][av.second],m[pos.first][pos.second]+1);
                    ds.push(make_pair(av.first,av.second));
                    mb[av.first][av.second]=false;
                }
            }
        }
        ds.pop();
    }

    int mi=0,Ma=r*c;
    while(Ma>mi) {
        int mid=(Ma+mi)/2;
        vector<vector<int>> mv(r,vector<int>(c,false));
        queue<pair<int,int>> q;
        q.push(make_pair(I.first,I.second));

        while(!q.empty()) {
            pair<int,int> pos(q.front().first,q.front().second);
            for(auto rv:rvs) {
                pair<int,int> av(pos.first,pos.second);
                av.first+=rv.first;
                av.second+=rv.second;
                if(av.first>=0&&av.second>=0&&av.first<r&&av.second<c) {
                    if(m[av.first][av.second]>mid&&!mv[av.first][av.second]) {
                        m[av.first][av.second]=min(m[av.first][av.second],m[pos.first][pos.second]+1);
                        q.push(make_pair(av.first,av.second));
                        mv[av.first][av.second]=true;
                    }
                }
            }
            q.pop();
        }
        if(mv[O.first][O.second]) {
            mi=mid+1;
        }
        else {
            Ma=mid;
        }
    }
    fout<<((Ma==0)?Ma:-1);
    return 0;
}