1421 - tabel
Enunț
După cum probabil ştiţi, contabilii îşi ţin datele sub formă de tabele şi calculează tot felul de sume pe linii şi pe coloane. Contabilul nostru Atnoc şi-a organizat valorile sub forma unui tabel cu n linii (numerotate de la 1 la n) şi m coloane (numerotate de la 1 la m). Elementele de pe ultima coloană sunt sumele elementelor de pe linii (mai exact, elementul de pe linia i şi coloana m este egal cu suma elementelor de pe linia i aflate pe coloanele 1, 2, …, m-1), iar elementele de pe ultima linie sunt sumele elementelor de pe coloane (mai exact, elementul de pe linia n şi coloana i este egal cu suma elementelor de pe coloana i aflate pe liniile 1, 2, …, n-1). Un exemplu de astfel de tabel este dat în figura următoare.
2
|
5
|
7
|
14
|
11
|
6
|
6
|
23
|
13
|
11
|
13
|
37
|
Din păcate, Atnoc a stropit cu apă minunatul său tabel şi astfel o parte dintre numerele din tabel au devenit ilizibile.
Cerința
Scrieţi un program care să reconstituie toate datele din tabel.
Date de intrare
Pe prima linie a fişierului text de intrare tabel.in se află două numere naturale n şi m, separate printr-un spaţiu, ce reprezintă numărul de linii şi respectiv numărul de coloane ale tabelului. Pe cea de a doua linie a fişierului de intrare se află un număr natural p care reprezintă numărul de valori nedeteriorate din tabel. Pe fiecare dintre următoarele p linii se află câte trei numere naturale, separate prin câte un spaţiu l c v, unde l este numărul liniei, c este numărul coloanei şi v este valoarea elementului de pe linia l şi coloana c din tabel.
Date de ieșire
În fişierul text de ieşire tabel.out se va scrie tabelul reconstituit, pe n linii câte m valori separate prin câte un spaţiu.
Restricții și precizări
1<n, m<51- Valorile din tabel sunt numere naturale
< 32000 - În toate testele datele din tabel pot fi reconstituite.
Exemplu:
tabel.in
3 4 10 1 1 2 1 2 5 1 3 7 1 4 14 2 2 6 2 4 23 3 1 13 3 2 11 3 3 13 3 4 37
tabel.out
2 5 7 14 11 6 6 23 13 11 13 37
<syntaxhighlight lang="python" line="1"> def reconstruct_table(table):
n = len(table) # numărul de linii
m = len(table[0]) # numărul de coloane
# Functie pentru a calcula suma unei linii
def calculate_row_sum(row):
return sum(x for x in row if x is not None)
# Functie pentru a calcula suma unei coloane
def calculate_col_sum(table, col):
return sum(table[i][col] for i in range(n-1) if table[i][col] is not None)
# Pasul 1: Completarea liniilor folosind suma liniei
for i in range(n-1):
row_sum = table[i][m-1]
current_sum = calculate_row_sum(table[i])
missing_count = table[i][:m-1].count(None)
if missing_count == 1:
for j in range(m-1):
if table[i][j] is None:
table[i][j] = row_sum - current_sum
# Pasul 2: Completarea coloanelor folosind suma coloanei
for j in range(m-1):
col_sum = table[n-1][j]
current_sum = calculate_col_sum(table, j)
missing_count = sum(1 for i in range(n-1) if table[i][j] is None)
if missing_count == 1:
for i in range(n-1):
if table[i][j] is None:
table[i][j] = col_sum - current_sum
# Pasul 3: Calcularea sumei pe ultima linie și ultima coloană
for i in range(n-1):
table[i][m-1] = calculate_row_sum(table[i])
for j in range(m-1):
table[n-1][j] = calculate_col_sum(table, j)
# Calcularea colțului de jos-dreapta
table[n-1][m-1] = sum(table[n-1][j] for j in range(m-1))
return table
- Exemplu de utilizare:
table = [
[2, 5, 7, 14], [11, None, 6, 23], [None, 11, 13, 37]
]
reconstructed_table = reconstruct_table(table) for row in reconstructed_table:
print(row)
</syntaxhighlight>