Cod sursa(job #3355609)

Utilizator sandrsSandra Paul sandrs Data 23 mai 2026 15:23:26
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <fstream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <string>
#include <unordered_map>
#include <vector>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
char mat[1001][1001];
int dis[1001][1001], disV2[1001][1001];
queue<pair<int, int>> q;
int di[4]={-1, 0, 1, 0};
int dj[4]={0, 1, 0, -1};
void Lee(int n, int m)
{
    int i, j;
    while(!q.empty())
    {
        i=q.front().first;
        j=q.front().second;
        q.pop();
        for(int k=0; k<4; k++)
        {
            int iv=i+di[k];
            int jv=j+dj[k];
            if(iv>=1 && iv<=n && jv>=1 && jv<=n && mat[iv][jv]!='*' && dis[iv][jv]>dis[i][j]+1)
            {
                dis[iv][jv]=dis[i][j]+1;
                q.push({iv, jv});
            }
        }
    }
}
void LeeV2(int n, int m, int i, int j, int mij)
{
    q.push({i, j});
    disV2[i][j]=0;
    while(!q.empty())
    {
        i=q.front().first;
        j=q.front().second;
        q.pop();
        for(int k=0; k<4; k++)
        {
            int iv=i+di[k];
            int jv=j+dj[k];
            if(iv>=1 && iv<=n && jv>=1 && jv<=n && mat[iv][jv]!='*' && disV2[iv][jv]>disV2[i][j]+1 && dis[iv][jv]>=mij)
            {
                disV2[iv][jv]=disV2[i][j]+1;
                q.push({iv, jv});
            }
        }
    }
}

int main(){
    int n, m, iI, jI, iO, jO;
    cin >> n >> m;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cin >> mat[i][j];
            if(mat[i][j]=='I')
            {
                iI=i;
                jI=j;
            }
            else if(mat[i][j]=='O')
            {
                iO=i;
                jO=j;
            }
            
            if(mat[i][j]=='D')
            {
                q.push({i, j});
                dis[i][j]=0;
            }
            else
                dis[i][j]=21e8;
        }
    }
    Lee(n, m);
    int st=0, dr=1000000, mij, rasp=0;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                disV2[i][j]=21e8;
            }
        }
        LeeV2(n, m, iI, jI, mij);
        if(disV2[iO][jO]!=21e8)
        {
            rasp=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    cout << rasp;
    
    
    
    return 0;
}