# PBinfo #868 – Acces1 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

Cerința
Se consideră o clădire de formă dreptunghiulară, împărțită în n*m camere, dispuse sub forma unei matrice cu n linii și m coloane. Dintr-o cameră se poate trece în oricare dintre cele 4 camere vecine pe linie sau pe coloană. Unele camere sunt închise, și în ele nu se poate intra deloc. Trecerea dintr-o cameră în altă cameră durează un minut.

În anumite camere se află echipe de pompieri. Pentru o intervenție cât mai rapidă în cazul unui eventual incendiu apărut în una dintre camerele clădirii, este necesar să se știe, pentru fiecare cameră care este timpul minim în care o echipă de pompieri ajunge în acea cameră.

Date de intrare
Fișierul de intrare acces1.in conține pe prima linie numerele n m; următoarele n linii conțin câte m caractere, care pot fi:


- – reprezintă o cameră liberă
# – reprezintă o cameră închisă
P – reprezintă o cameră în care se găsește o echipă de pompieri

Date de ieșire
Fișierul de ieșire acces1.out va conține o matrice cu n linii și m coloane, fiecare element al matricei reprezentând timpul minim necesar ca o echipă de pompieri să ajungă în camera corespunzătoare. Pentru camerele ocupate se va fișa simbolul #, iar pentru cele libere în care nu va ajunge nici o echipă se va afișa -.
Matricea va fi afișată linie cu linie, câte o linie a matricei pe o linie a fișierului, elementele de pe fiecare linie fiind separate prin câte un spațiu.

Restricții și precizări

1 ≤ n,m ≤ 1000

Exemplu:
acces1.in

4 6
P-#-#P
--##--
--P---
-----#
acces1.out

0 1 # - # 0 
1 2 # # 2 1 
2 1 0 1 2 2 
3 2 1 2 3 #

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
ifstream in("acces1.in");
ofstream out("acces1.out");
#define cin in
#define cout out
int n, m, mat[1010][1010], minim = 10000001;
char cmat[1010][1010];
int ql[1000001], qc[1000001];
int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
int main() {
      cin >> n >> m;
      int contor = 1, prima = 0;
      for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++) {
                  cin >> cmat[i][j];
                  if (cmat[i][j] == '-') mat[i][j] = 0;
                  else if (cmat[i][j] == '#') mat[i][j] = -1;
                  else mat[i][j] = 1, prima++, ql[prima] = i, qc[prima] = j;
            }
      while (contor <= prima) {
            int i = ql[contor], j = qc[contor];
            for (int v = 0; v < 4; v++) {
                  int ii = i + dx[v], jj = j + dy[v];
                  if (ii > 0 && jj > 0 && jj <= m && ii <= n && mat[ii][jj] == 0 && cmat[ii][jj] != '#')
                        prima++, ql[prima] = ii, qc[prima] = jj, mat[ii][jj] = mat[i][j] + 1;
            }
            contor++;
      } for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++)
                  if (mat[i][j] > 0)
                        cout << mat[i][j] - 1 << " ";
                  else
                        cout << cmat[i][j] << " ";
            cout << endl;
      }
      return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/868)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/868/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-868/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
