Cerința
Harta unei galaxii îndepărtate are forma unei matrice cu n
linii și m
coloane, în care fiecare element corespunde unei planete. Unele planete sunt locuibile, altele sunt afectate de radiații nucleare și nu pot fi locuite. Deplasarea prin galaxie se poate face doar de la o planetă la alta, cu condiția să fie ambele locuibile și să se învecineze pe linie sau pe coloană (teleportarea și zborul hiperluminic nu au fost încă inventate).
În această galaxie există patru imperii, având ca nume litere mari diferite ale alfabetului englez, iar capitalele lor sunt situate în cele patru colțuri ale matricei. Ele își dispută din cele mai vechi timpuri controlul planetelor locuibile din galaxie, dar acum au ajuns la un acord: fiecare imperiu va controla planetele locuibile situate față de el la o distanță mai mică decât față de celelalte trei imperii. Dacă o planetă se află la aceeași distanță minimă față de două sau mai multe imperii, ea va rămâne necontrolată de niciun imperiu. Planetele nelocuibile nu fac parte din niciun imperiu. Prin distanța dintre două planete se înțelege distanța minimă dintre ele.
Afișați harta galaxiei în care planetele sunt marcate în conformitate cu imperiul care le controlează.
Date de intrare
Fișierul de intrare imperii.in
conține pe prima linie numerele n m
. Urmează n
linii cu câte m
caractere, reprezentând harta imperiului. Caracterele pot fi: -
, pentru o planetă locuibilă, #
, pentru o planetă nelocuibilă, respectiv patru litere mari distincte ale alfabetului englez, pentru cele patru imperii.
Date de ieșire
Fișierul de ieșire imperii.out
va conține n
linii, fiecare cu câte m
caractere, reprezentând harta imperiului, în care planetele controlate de un anumit imperiu sunt marcate cu litera corespunzătoare acestuia.
Restricții și precizări
1 ≤ n , m ≤ 1000
Exemplu
imperii.in
5 7 D-#---Y ------- ##--#-- --#---# M-----A
imperii.out
DD#YYYY DDD-YYY ##D-#-Y MM#-AA# MMM-AAA
#include <bits/stdc++.h> using namespace std; ifstream cin("imperii.in"); ofstream cout("imperii.out"); #define Inf 100000001 #define Max 1001 struct poz { int i , j; }; const int di[] = {-1 , 1 , 0 , 0}; const int dj[] = {0 , 0 , -1 , 1}; queue< pair<int, poz> > Q; int n , m; int d1[Max][Max], d2[Max][Max], d3[Max][Max], d4[Max][Max]; bool a[Max][Max]; int inside(int i , int j) { return i >= 1 && i <= n && j >= 1 && j <=m; } void Lee(int i , int j, int d[][Max]) { poz x; x.i = i; x.j = j; Q.push(make_pair(0, x)); while(!Q.empty()) { x = Q.front().second; if (Q.front().first < d[x.i][x.j]) continue; for(int i = 0 ; i < 4 ; i++) { int inou = x.i + di[i]; int jnou = x.j + dj[i]; if(inside(inou , jnou) && (d[inou][jnou] > d[x.i][x.j] + 1 || d[inou][jnou] == 0) && a[inou][jnou] != 1) { poz y; y.i = inou; y.j = jnou; d[inou][jnou] = d[x.i][x.j] + 1; Q.push(make_pair(d[inou][jnou], y)); } } Q.pop(); } d[i][j] = 0; } int main() { char c, c1, c2, c3, c4; cin >> n >> m; for (int i = 1; i <= n; i ++) for (int j = 1; j <= m; j ++) { cin >> c; if (c == '#')a[i][j] = 1; if (i == 1 && j == 1)c1 = c; if (i == 1 && j == m)c2 = c; if (i == n && j == 1)c3 = c; if (i == n && j == m)c4 = c; } Lee(1, 1, d1); Lee(1, m, d2); Lee(n, 1, d3); Lee(n, m, d4); for (int i = 1; i <= n; i ++) { for (int j = 1; j <= m; j ++) { if (a[i][j])cout <<'#'; else if (d1[i][j] < d2[i][j] && d1[i][j] < d3[i][j] && d1[i][j] < d4[i][j])cout << c1; else if (d2[i][j] < d1[i][j] && d2[i][j] < d3[i][j] && d2[i][j] < d4[i][j])cout << c2; else if (d3[i][j] < d2[i][j] && d3[i][j] < d1[i][j] && d3[i][j] < d4[i][j])cout << c3; else if (d4[i][j] < d2[i][j] && d4[i][j] < d1[i][j] && d4[i][j] < d3[i][j])cout << c4; else cout << '-'; } cout << '\n'; } }