0669 - Lin Col

De la Universitas MediaWiki

Sursă: [1]

Cerinţa

Se dă o matrice cu n linii și m coloane și elemente numere naturale. Se cere să se determine suma elementelor de pe anumite linii și coloane, precizate.

Date de intrare

Fișierul de intrare lincol.in va conține pe prima linie numerele n m, Următoarele n linii conțin câte m numere naturale, separate prin spații, reprezentând elementele matricei. Următoarea linie conține numărul de întrebări, p, iar fiecare dintre următoarele p linii conține câte o întrebare, de forma Q I, unde Q poate fi unul dintre caracterele L sau C, iar I este un număr natural. Dacă Q = L, se cere determinarea sumei elementelor de pe linia I, iar dacă Q = C se cere determinarea sumei elementelor de pe coloana I.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.". Fișierul de ieșire lincol.outva conține p linii, fiecare conținând, în ordine, răspunsul la întrebarea corespunzătoare. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricții și precizări

  • 1 ≤ n , m ≤ 100
  • elementele matricei sunt numere naturale mai mici decât 1.000.000
  • 1 ≤ p ≤ 100
  • liniile sunt numerotate de la 1 la n, iar coloanele de la 1 la m

Exemple

Exemplu 1

lincol.in
4 5
4 7 5 4 2
1 1 2 3 4
2 2 0 0 3
4 8 2 6 1
6
C 2
L 1
C 3
C 5
L 4
C 3
lincol.out
18
22
9
10
21
9

Rezolvare

def citire_matrice():
    # Deschide fișierul de intrare și citește n, m și matricea
    with open("lincol.in", "r") as fin:
        n, m = map(int, fin.readline().split())
        if not (1 <= n <= 100 and 1 <= m <= 100):
            print("Datele nu sunt conform restrictiilor impuse.")
            exit()
        matrice = []
        # Citește matricea din fișierul de intrare
        for i in range(n):
            row = list(map(int, fin.readline().split()))
            # Verifică dacă elementele matricei sunt conform cerințelor
            if not all(x <= 1000000 for x in row):
                print("Datele nu sunt conform restrictiilor impuse.")
                exit()

            matrice.append(row)

        # Citește numărul de întrebări
        p = int(fin.readline())
        intrebari = []
        # Citește întrebările din fișierul de intrare
        for i in range(p):
            linie = fin.readline().split()
            intrebare = {'tip': linie[0], 'index': int(linie[1])}
            intrebari.append(intrebare)

        return n, m, matrice, intrebari


def LinCol(n, m, matrice, intrebari):
    with open("lincol.out", "w") as fout:
        for intrebare in intrebari:
            s = 0
            if intrebare['tip'] == 'C':
                for i in range(n):
                    s += matrice[i][intrebare['index'] - 1]
            elif intrebare['tip'] == 'L':
                for j in range(m):
                    s += matrice[intrebare['index'] - 1][j]
            fout.write(str(s) + "\n")

if _name_ == "_main_":
    n, m, matrice, intrebari = citire_matrice()
    LinCol(n, m, matrice, intrebari)

Explicații

Acesta este un program Python care citeste o matrice dintr-un fisier de intrare, efectueaza operatii de suma pe coloane sau linii ale matricei, si afiseaza rezultatele intr-un fisier de iesire.
Functia citire_matrice() citeste dimensiunile matricei si elementele acesteia din fisierul de intrare. De asemenea, citeste numarul de intrebari si construieste o lista de dictionare, unde fiecare dictionar contine tipul de intrebare (linie sau coloana) si indexul acesteia. Functia returneaza toate aceste informatii.
Functia LinCol() efectueaza operatiile de suma cerute in intrebari si afiseaza rezultatele in fisierul de iesire. Pentru fiecare intrebare, functia parcurge linia sau coloana corespunzatoare si calculeaza suma elementelor. Rezultatul este afisat in fisierul de iesire.
In if _name_ == "_main_": se apeleaza functia citire_matrice() pentru a obtine informatiile necesare, si apoi se apeleaza functia LinCol() pentru a efectua operatiile si afisa rezultatele.