1421 - tabel

From Bitnami MediaWiki

Enunț[edit | edit source]

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[edit | edit source]

Scrieţi un program care să reconstituie toate datele din tabel.

Date de intrare[edit | edit source]

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[edit | edit source]

Î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[edit | edit source]

  • 1<n, m<51
  • Valorile din tabel sunt numere naturale < 32000
  • În toate testele datele din tabel pot fi reconstituite.

Exemplu:[edit | edit source]

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
  1. 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>