Cod sursa(job #2951691)

Utilizator PieleVoinescu David Piele Data 6 decembrie 2022 22:57:36
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#define nmax 1005
#define abs(a,b) ((a>b)?(a-b):(b-a))

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

int n,m;
int mat[nmax][nmax];
int ras[nmax][nmax];
int istop,jstop;
queue<pair<int,int>>Q;
vector<pair<int,int>>Vec;
const int di[4]={-1,0,1,0};
const int dj[4]={0,1,0,-1};

bool ebun(int i,int j)
{
    return i>=1 && i<=n && j>=1 && j<=m;
}

int dist(int x1,int y1,int x2,int y2)
{
    return abs(x1,x2)+abs(y1,y2);
}

void citire()
{
    fin>>n>>m;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
    {
        char lit;
        fin>>lit;
        if(lit=='I')
        Q.push({i,j});
        else if(lit=='O')
        {
            istop=i;
            jstop=j;
        }
        else if(lit=='*')
        mat[i][j]=1;
        else if(lit=='D')
        {
            mat[i][j]=1;
            Vec.push_back({i,j});
        }
    }
}

int minimul_dragoni(int startx,int starty)
{
    int dist_min=INT_MAX;
    for (auto &x:Vec)
        dist_min=min(dist_min,dist(startx,starty,x.first,x.second));
    return dist_min;
}

void Lee()
{
    int startx=Q.front().first;
    int starty=Q.front().second;
    int dist_min=INT_MAX;
    for (auto &x:Vec)
        dist_min=min(dist_min,dist(startx,starty,x.first,x.second));
    ras[startx][starty]=dist_min;
    while(!Q.empty())
    {
        int i=Q.front().first;
        int j=Q.front().second;
        Q.pop();
        for (int dir=0;dir<4;++dir)
        {
            int i_nou=i+di[dir];
            int j_nou=j+dj[dir];
            if(ebun(i_nou,j_nou) && mat[i_nou][j_nou]==0 && ras[i_nou][j_nou]==0)
            {
                ras[i_nou][j_nou]=min(ras[i][j],minimul_dragoni(i_nou,j_nou));
                Q.push({i_nou,j_nou});
            }
            else if(ebun(i_nou,j_nou) && mat[i_nou][j_nou]==0 && ras[i_nou][j_nou]!=0)
            {
                ras[i_nou][j_nou]=max(ras[i_nou][j_nou],ras[i][j]);
            }
        }
    }
    fout<<ras[istop][jstop];
}

int main()
{citire();
    Lee();
    return 0;
}