1421 - tabel

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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)