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 -.
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 #
#include <bits/stdc++.h>
using namespace std;
ifstream cin("acces1.in");
ofstream cout("acces1.out");
const int di[]={-1 , 0 , 1 , 0};
const int dj[]={0 , 1 , 0 , -1};
int n , m ;
int a[1002][1002], numar;
bool prt[1001][1001];
struct poz{int i , j;};
poz q[1000000];
bool inside(int i , int j){return i>=1 && i<=n && j>=1 && j<=m;}
void lee(int dr)
{
int st=1;
while(st<=dr)
{
int i = q[st].i;
int j = q[st].j;
//if (i == n)break;
for(int d = 0 ; d < 4 ; d++)
{
int inou=i+di[d];
int jnou=j+dj[d];
if(inside(inou,jnou) && a[inou][jnou]==0 )
{
q[++dr].i=inou;
q[dr].j=jnou;
a[inou][jnou]=a[i][j]+1;
}
}
st++;
}
//return a[q[st].i][q[st].j];
}
int main()
{
char ch;
int dr = 0;
cin >> n >> m;
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= m; ++ j)
{
cin >> ch;
if (ch == 'P')
{
poz start;
start.i = i;
start.j = j;
a[i][j] = 1;
q[++ dr] = start;
prt[i][j] = 1;
}
else if (ch == '#')a[i][j] = -1;
//else if (ch == '-')a[i][j] = 1;
}
lee(dr);
for (int i = 1; i <= n; ++ i)
{
for (int j = 1; j <= m; ++ j)
if (a[i][j] == -1)cout << "# ";
else if (a[i][j] == 0 && prt[i][j] == 0)cout << "- ";
else cout << a[i][j] - 1 << ' ';
cout << '\n';
}
return 0;
}