Cod sursa(job #2434214)

Utilizator CharacterMeCharacter Me CharacterMe Data 1 iulie 2019 10:44:38
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int Ox[4]={1, 0, -1, 0};
int Oy[4]={0, 1, 0, -1};
int N, M, i, j, k, Dist[1001][1001], Map[1001][1001], L, R, mid;
bool Good[2002];
queue<pair<int, int> > Q; char c;
pair<int, int> Start, Finish;
void formDist();
bool BFS(int distance);
int main()
{
    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);
    scanf("%d%d", &N, &M); fgetc(stdin);
    for(i=1; i<=N; ++i){
        for(j=1; j<=M; ++j){
            scanf("%c", &c);
            if(c=='.' || c=='O') Map[i][j]=0;
            if(c=='O') Finish={i, j};
            if(c=='I'){Map[i][j]=1; Start={i, j};}
            if(c=='D'){Map[i][j]=-1; Dist[i][j]=1; Q.push({i, j});}
            if(c=='*') Map[i][j]=Dist[i][j]=-2;
        }
        fgetc(stdin);
    }
    while(!Q.empty()){
        pair<int, int> P=Q.front(); Q.pop();
        for(k=0; k<4; ++k){
            pair<int, int> P1={P.first+Ox[k], P.second+Oy[k]};
            if(P1.first<1 || P1.first>N || P1.second<1 || P1.second>M || Dist[P1.first][P1.second]!=0) continue;
            Dist[P1.first][P1.second]=Dist[P.first][P.second]+1;
            Q.push(P1);
        }
    }
    L=2; R=min(Dist[Start.first][Start.second], Dist[Finish.first][Finish.second]);
    if(BFS(1)==false){printf("-1"); return 0;}
    while(true){
        mid=(L+R)/2;
        if(BFS(R)==true) {printf("%d", R-1); return 0;}
        if(Good[mid]==true){printf("%d", mid-1); return 0;}
            else Good[mid]=true;
        if(BFS(mid)==true) L=mid;
        else R=mid-1;
    }
    return 0;
}
bool BFS(int distance){
    while(!Q.empty()) Q.pop();
    Q.push(Start);
    for(i=1; i<=N; ++i)
        for(j=1; j<=M; ++j) if(Map[i][j]>1) Map[i][j]=0;
    while(!Q.empty()){
        pair<int, int> P=Q.front(); Q.pop();
        for(k=0; k<4; ++k){
            pair<int, int> P1={P.first+Ox[k], P.second+Oy[k]};
            if(P1.first<1 || P1.first>N || P1.second<1 || P1.second>M || Map[P1.first][P1.second]!=0 || Dist[P1.first][P1.second]<distance) continue;
            if(P1==Finish) return true;
            Map[P1.first][P1.second]=2;
            Q.push(P1);
        }
    }
    return false;
}