Cod sursa(job #3281914)

Utilizator Martin_BohonyiMartin Bohonyi Martin_Bohonyi Data 3 martie 2025 22:16:13
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
#include<fstream>
#include<queue>
using namespace std;

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

int N , M , D[1001][1001] , V[1001][1001];
int LinS , ColS , LinF , ColF;

queue<pair<int,int>>Q;

bool inmat(int i , int j){
     return i>=1 && i<=N && j>=1 && j<=M;
 }

int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};

void Fill(){
    while(!Q.empty()){
        int Lin1=Q.front().first , Col1=Q.front().second;
        Q.pop();
        for(int k=0 ; k<4 ; k++){
             int Lin2=Lin1+dx[k] , Col2=Col1+dy[k];
             if(inmat(Lin2,Col2)){
                if(D[Lin2][Col2]>=0 && D[Lin1][Col1]<=-1){
                    D[Lin2][Col2]=D[Lin1][Col1]+1;
                    Q.push(make_pair(Lin2,Col2));
                }
             }
        }
    }
 }

void Drum(){
     D[LinS][ColS]=1;
     Q.push(make_pair(LinS,ColS));
     while(!Q.empty()){
        int Lin1=Q.front().first , Col1=Q.front().second;
        Q.pop();
        for(int k=0 ; k<4 ; k++){
            int Lin2=Lin1+dx[k] , Col2=Col1+dy[k];
            if(inmat(Lin2,Col2)){
                if(D[Lin2][Col2] == 0){
                    D[Lin2][Col2]=D[Lin1][Col1]+1;
                    Q.push(make_pair(Lin2,Col2));
                }
            }
        }
     }
 }

void Reset(){
     for(int i=1 ; i<=N ; i++)
        for(int j=1 ; j<=M ; j++)
            D[i][j]=V[i][j];
 }

int main()
{
fin>>N>>M;
fin.get();
for(int i=1 ; i<=N ; i++){
     char S[1001];
     fin>>S;
     for(int j=1 ; j<=M ; j++){
        if(S[j-1] == '*')
            V[i][j]=0; /// Zid
        if(S[j-1] == '-')
            V[i][j]=0;
        if(S[j-1] == 'I'){
            LinS=i;
            ColS=j;
        }
        if(S[j-1] == 'O'){
            LinF=i;
            ColF=j;
        }
        if(S[j-1] == 'D'){
            V[i][j]=-2;
        }

        D[i][j]=V[i][j];
     }
 }

int R=-1;
for(int Val=1 ; Val<=N*M ; Val++){

    for(int i=1 ; i<=N ; i++)
        for(int j=1 ; j<=M ; j++)
           if(D[i][j] == -2){
               D[i][j]=(-1)*Val;
               Q.push(make_pair(i,j));
        }

    Fill();

    if(D[LinS][ColS] == 0){
        Drum();
        if(D[LinF][ColF] > 0)
           R=Val;
        else
           break;
    }
    else
        break;

    /*
    for(int i=1 ; i<=N ; i++ , fout<<'\n')
        for(int j=1 ; j<=M ; j++)
             fout<<D[i][j]<<' ';
    */


    Reset();
}

fout<<R<<'\n';
return 0;
}