Cod sursa(job #2760436)

Utilizator matei.tudoseMatei Tudose matei.tudose Data 26 iunie 2021 13:56:47
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <fstream>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

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

int R, C, temnita[1000][1000], temnita_de_scriere[1000][1000], distante_dragoni[1000][1000], contor_dragoni;

struct coord
{
    int linie, col;
};

queue<coord> coada;

coord dragoni[1000], finish, erou;

bool este_in_mat(int linie, int col)
{
    return (0 <= linie && linie < R && 0 <= col && col < C);
}

void Lee(int distante[1000][1000], int limita_dist)
{
    while (!coada.empty())
    {
        int dirLinie[4] = {-1, 1, 0, 0};
        int dirCol[4] = {0, 0, -1, 1};
        coord curent = coada.front();
        coada.pop();
        for (int i = 0; i < 4; i++)
        {
            coord vecin;
            vecin.linie = curent.linie + dirLinie[i];
            vecin.col = curent.col + dirCol[i];
            if (este_in_mat(vecin.linie, vecin.col) && temnita[vecin.linie][vecin.col] == 0 && distante[vecin.linie][vecin.col] == 0 && distante_dragoni[vecin.linie][vecin.col] > limita_dist)
            {
               
                coada.push(vecin);
                distante[vecin.linie][vecin.col] = distante[curent.linie][curent.col] + 1;
            }
        }
    }
}

void calc_distante_dragoni()
{

    for (int i = 0; i < contor_dragoni; i++)
    {
        coada.push(dragoni[i]);
        distante_dragoni[dragoni[i].linie][dragoni[i].col] = 1;
    }
    Lee(distante_dragoni, -1);
}

int rezolvare()
{
    int rasp = -1, st = 0, dr = 1000000;
    while (st <= dr)
    {
        memset(temnita_de_scriere, 0, sizeof temnita_de_scriere);
        int mid = (st + dr) / 2;
        coada.push(erou);
        temnita_de_scriere[erou.linie][erou.col] = 1;
        Lee(temnita_de_scriere, mid);
        if (temnita_de_scriere[finish.linie][finish.col] != 0)
        {
            rasp = mid;
            st = mid + 1;
        }
        else
            dr = mid - 1;
    }
    return rasp;
}

int main()
{
    fin >> R >> C;
    string linie;
    getline(fin, linie);
    for (int i = 0; i < R; i++)
    {
        string caractere;
        getline(fin, caractere);
        for (int j = 0; j < C; j++)
        {
            if (caractere[j] == 'I')
            {
                erou.linie = i;
                erou.col = j;
            }
            else if (caractere[j] == 'D')
            {
                temnita[i][j] = -1;
                coord dragon;
                dragon.linie = i;
                dragon.col = j;
                dragoni[contor_dragoni++] = dragon;
            }
            else if (caractere[j] == '*')
                temnita[i][j] = -1;
            else if (caractere[j] == 'O')
            {
                finish.linie = i;
                finish.col = j;
            }
        }
    } 
    calc_distante_dragoni();
    int raspuns = rezolvare();
    fout << raspuns << "\n";
    return 0;
}