Cod sursa(job #3299127)

Utilizator InformaticianInDevenire1Munteanu Mihnea Gabriel InformaticianInDevenire1 Data 4 iunie 2025 18:13:55
Problema Barbar Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <bits/stdc++.h>
#define fi first
#define se second

using namespace std;

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

const int CNST = 1e4;
int n,m;
char ch[1005][1005];
int viz[1005][1005];
int Lee[1005][1005];
int dx[4],dy[4];
queue <pair <int,int>> q;
priority_queue <pair <int,pair <int,int>>> h; // value ; indexI indexJ

void MakeDs(){
    dx[1] = 0;
    dx[3] = 0;
    dx[0] = -1;
    dx[2] = 1;
    dy[0] = 0;
    dy[2] = 0;
    dy[1] = 1;
    dy[3] = -1;
    return;
}

bool IsInMatrix(int i,int j){
    if (i<1 or n<i) return 0;
    if (j<1 or m<j) return 0;
    return 1;
}

bool IsWalkable(int i,int j){
    if (ch[i][j]=='I' or ch[i][j]=='O' or ch[i][j]=='.') return 1;
    return 0;
}

void Lee_Function(){
    while (!q.empty()){
        int x = q.front().first, y = q.front().second;
        q.pop();
        for (int k=0;k<=3;++k){
            int nx = x+dx[k], ny = y+dy[k];
            if (IsInMatrix(nx,ny)==1 and Lee[nx][ny]==CNST){
                Lee[nx][ny] = Lee[x][y]+1;
                q.push({nx,ny});
            }
        }
    }
    return;
}

signed main()
{
    ios::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);
    MakeDs();
    fin >> n >> m;
    int ist = 0,jst = 0;
    int ifn = 0,jfn = 0;
    for (int i=1;i<=n;++i){
        for (int j=1;j<=m;++j){
            fin >> ch[i][j];
            Lee[i][j] = CNST;
            if (!IsWalkable(i,j)) Lee[i][j] += CNST;
            if (ch[i][j]=='I'){
                ist = i;
                jst = j;
            }
            if (ch[i][j]=='O'){
                ifn = i;
                jfn = j;
            }
        }
    }
    for (int i=1;i<=n;++i){
        for (int j=1;j<=m;++j){
            if (ch[i][j]=='D'){
                q.push({i,j});
                Lee[i][j] = 0;
            }
        }
    }
    Lee_Function();
    h.push({Lee[ist][jst],{ist,jst}});
    viz[ist][jst] = 1;
    int ans = Lee[ist][jst];
    while (!h.empty() and !viz[ifn][jfn]){
        int x = h.top().se.fi, y = h.top().se.se;
        ans = ans>Lee[x][y] ? Lee[x][y] : ans;
        viz[x][y] = 1;
        h.pop();
        for (int k=0;k<=3;++k){
            int nx = x+dx[k], ny = y+dy[k];
            if (IsInMatrix(nx,ny) and IsWalkable(nx,ny)==1 and viz[nx][ny]==0){
                h.push({Lee[nx][ny],{nx,ny}});
            }
        }
    }
    if (viz[ifn][jfn]==0) ans = -1;
    fout << ans;
    return 0;
}