Cod sursa(job #3189710)

Utilizator TomMMMMatei Toma TomMMM Data 6 ianuarie 2024 14:15:12
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct cell{
    int line;
    int colum;
};
int R,C;
int maze[1001][1001];

cell dragons[10001];
int dist_dragons[1001][1001];
int dist[1001][1001];
int sol;
int nr_dra=0;
cell IN,OUT;

queue<cell> Coada;


void create_dragon(int lin, int col){
    dragons[++nr_dra]={lin,col};
    maze[lin][col]=2;
}
void read(){
    fin>>R>>C;
    fin.get();
    for(int i=1;i<=R;i++){
        char s[1002];
        fin.getline(s+1,1001);
        for(int j=1;j<=C;j++){
            switch(s[j]){
                case '.':maze[i][j]=0;break;
                case '*':maze[i][j]=1;break;
                case 'D':create_dragon(i,j);break;
                case 'I':IN.line=i;IN.colum=j;maze[i][j]=3; break;
                case 'O':OUT.line=i;OUT.colum=j; maze[i][j]=4;break;
            }
            dist_dragons[i][j]=-1;

        }
    }
}

void empty_Coada(){
    while(!Coada.empty()){
        Coada.pop();
    }
}

void Ini_dra(){
    for(int i=1;i<=nr_dra;i++){
        cell x=dragons[i];
        Coada.push(x);
        dist_dragons[x.line][x.colum]=0;
    }
}
void Ini_person(){
    dist[IN.line][IN.colum]=0;
    Coada.push(IN);
}

int isValid(int line, int colum, int mat[][1001], int number){
    if(line>=1 && line<=R && colum>=1 && colum <=C && mat[line][colum]==-1
    && maze[line][colum]!=1 && dist_dragons[line][colum]>=number)
        return 1;
    return 0;
}

void Lee(int mat[][1001], char C, int number){
    empty_Coada();
    int l[5]={-1,0,1,0};
    int c[5]={0,1,0,-1};
    switch(C){
        case 'D': Ini_dra();break;
        case 'F': Ini_person();break;
    }
    while(!Coada.empty()){
        cell x=Coada.front();
        Coada.pop();
        for(int i=0;i<=3;i++){
            int lin=x.line+l[i],col=x.colum+c[i];
            if(isValid(lin,col, mat, number)){
                Coada.push({lin,col});
                mat[lin][col]=mat[x.line][x.colum]+1;
            }
        }
        if(number>0 && mat[OUT.line][OUT.colum]!=-1){
            break;
        }

    }

}
int max(int a, int b){
    return (a>b?a:b);
}
void reset(){
    for(int i=1;i<=R;i++){
        for(int j=1;j<=C;j++){
            dist[i][j]=-1;
        }
    }
}


int test(int number){
    reset();
    Lee(dist, 'F', number);
    if(dist[OUT.line][OUT.colum]!=-1)
        return 1;
    return 0;
}


int main() {
    read();
    Lee(dist_dragons , 'D', -10);
    int Right=max(R,C),Left=1,middle;
    while(Left<Right){
        middle=(Left+Right)/2;
        int sem=test(middle);
        if(sem==1){
            sol=middle;
            Left=middle+1;
        }else{
            Right=middle-1;
        }
    }
    fout<<sol;

}