Cod sursa(job #2741820)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 19 aprilie 2021 14:19:15
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
vector<int> dist(1000000);
int r,c,s,inc,fin,maxx;
char ce;
queue<int> q;
priority_queue<pair<int,int>> pq;
vector<int> d;
void bfs(){
    while(!q.empty()){
        int n=q.front();
        q.pop();
        int x=n-1;
        if(n%c!=0&&dist[x]==0){
            q.push(x);
            dist[x]=dist[n]+1;
        }
        x=n+1;
        if(x%c!=0&&dist[x]==0){
            q.push(x);
            dist[x]=dist[n]+1;
        }
        x=n-c;
        if(x>=0&&dist[x]==0){
            q.push(x);
            dist[x]=dist[n]+1;
        }
        x=n+c;
        if(x<s&&dist[x]==0){
            q.push(x);
            dist[x]=dist[n]+1;
        }
    }
}

int rez(){
    int minn=dist[inc];
    pq.push({dist[inc],inc});
    vector<bool> viz(s);
    viz[inc]=1;
    while(!pq.empty()){
        int n=(pq.top()).second;
        pq.pop();
        if(minn>dist[n])minn=dist[n];
        if(n==fin)return minn;
        int x=n-1;
        if(n%c!=0&&viz[x]==0){
                pq.push({dist[x],x});
                viz[x]=1;
        }
        x=n+1;
        if(x%c!=0&&viz[x]==0){
                pq.push({dist[x],x});
                viz[x]=1;
        }
        x=n-c;
        if(x>=0&&viz[x]==0){
                pq.push({dist[x],x});
                viz[x]=1;
        }
        x=n+c;
        if(x<s&&viz[x]==0){
                pq.push({dist[x],x});
                viz[x]=1;
        }
    }
}

int main(){
    in>>r>>c;
    s=r*c;
    for(int i=0;i<s;i++){
        in>>ce;
        if(ce=='I'){
            inc=i;
        }else
        if(ce=='O'){
            fin=i;
        }else
        if(ce=='D'){
            d.push_back(i);
            q.push(i);
        }else
        if(ce=='*'){
            dist[i]=-1;
        }
    }
    bfs();
    for(auto i:d)dist[i]=-1;
    out<<rez();
}