Cod sursa(job #2740188)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 11 aprilie 2021 21:10:53
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.35 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;
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;
        }

    }
}
bool rez(){
    q.push(inc);
    vector<bool> viz(s);
    viz[inc]=1;
    while(!q.empty()){
        int n=q.front();
        q.pop();
        int x=n-1;
        if(n%c!=0&&viz[x]==0){
            if(dist[x]>=maxx){
                if(x==fin){
                    return 1;
                }
                q.push(x);
                viz[x]=1;
            }
        }
        x=n+1;
        if(x%c!=0&&viz[x]==0){
            if(dist[x]>=maxx){
                if(x==fin){
                    return 1;
                }
                q.push(x);
                viz[x]=1;
            }
        }
        x=n-c;
        if(x>=0&&viz[x]==0){
            if(dist[x]>=maxx){
                if(x==fin){
                    return 1;
                }
                q.push(x);
                viz[x]=1;
            }
        }
        x=n+c;
        if(x<s&&viz[x]==0){
            if(dist[x]>=maxx){
                if(x==fin){
                    return 1;
                }
                q.push(x);
                viz[x]=1;
            }
        }
    }
    return 0;
}
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;
    if(dist[inc]>dist[fin])maxx=dist[fin];
    else maxx=dist[inc];
    while(!rez()){
        maxx--;
    }
    out<<maxx;
}