Cod sursa(job #3242542)

Utilizator Luca07Nicolae Luca Luca07 Data 12 septembrie 2024 16:28:27
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>
#include<vector>
#include<queue>
#include<string>
using namespace std;

#define int short

ifstream cin("barbar.in");
ofstream cout("barbar.out");

vector<vector<pair<int,int>>> val;
vector<string> mat;

vector<pair<int,int>> vdir={{0,1},{1,0},{0,-1},{-1,0}};

struct Data{
    int i,j,val;
};

queue<Data> qd;


signed main()
{
    int n,m,i,j,si,sj,ei,ej;
    string s;

    cin>>n>>m;
    val=vector<vector<pair<int,int>>>(n,vector<pair<int,int>>(m,{INT16_MAX,0}));
    for(i=0;i<n;i++){
        cin>>s;
        for(j=0;j<n;j++){
            if(s[j]=='I'){
                si=i;
                sj=j;
            }
            else if(s[j]=='O'){
                ei=i;
                ej=j;
            }
            else if(s[j]=='D'){
                qd.push({i,j,0});
                val[i][j].first=0;
            }
        }
        mat.push_back(s);
    }


    while(!qd.empty()){
        Data dt=qd.front();
        qd.pop();
        for(auto dir:vdir){
            i=dt.i+dir.first;
            j=dt.j+dir.second;
            if(i>=0&&i<n&&j>=0&&j<m&&mat[i][j]!='*'&&val[i][j].first>dt.val+1){
                val[i][j].first=dt.val+1;
                qd.push({i,j,dt.val+1});
            }
        }
    }


    qd.push({si,sj,INT16_MAX});
    bool ok=false;
    while(!qd.empty()){
        Data dt=qd.front();
        if(dt.i==ei&&dt.j==ej){
            ok=true;
        }
        qd.pop();
        for(auto dir:vdir){
            i=dt.i+dir.first;
            j=dt.j+dir.second;
            if(i>=0&&i<n&&j>=0&&j<m&&mat[i][j]!='*'&&val[i][j].second<min(dt.val,val[i][j].first)){
                val[i][j].second=min(dt.val,val[i][j].first);
                qd.push({i,j,val[i][j].second});
            }
        }
    }
    if(!ok){
        val[ei][ej].second=-1;
    }

    cout<<val[ei][ej].second;

    return 0;
}