1421 - tabel

De la Universitas MediaWiki
Versiunea din 4 august 2024 13:20, autor: RaulOtet (discuție | contribuții) (Pagină nouă: = 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 <code>n</code> linii (numerotate de la <code>1</code> la <code>n</code>) şi <code>m</code> coloane (numerotate de la <code>1</code> la <code>m</code>). Elementele de pe ultima coloană sunt sumele elementelor de pe linii (mai exact, elementul de pe linia <co...)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

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
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)