# PBinfo #866 – Acces – 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 una dintre camere se află proprietarul clădirii, care dorește să afle, pentru fiecare dintre camere care este timpul minim necesar pentru a ajunge în acea cameră.

Date de intrare
Fișierul de intrare acces.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ă camera proprietarului, care se consideră liberă

Date de ieșire
Fișierul de ieșire acces.out va conține o matrice cu n linii și m coloane, elementele matricei reprezentând timpul minim necesar ca proprietarul să ajungă în camere clădirii. Pentru camerele ocupate și pentru camerele libere în care nu se poate ajunge timpul necesar va fi -1.
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:
acces.in

4 6
--#-#-
--##--
--P---
-----#
acces.out

4 3 -1 -1 -1 5 
3 2 -1 -1 3 4 
2 1 0 1 2 3 
3 2 1 2 3 -1

## Cod sursă C++

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

## Resurse

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