0635 - Vecini 1

De la Universitas MediaWiki

Sursă: [1]

Cerinţa

Se dă o matrice cu n linii și m coloane și elemente numere naturale. Determinați pentru câte dintre elementele matricei toți vecinii au valori diferite între ele.

Date de intrare

Fișierul de intrare vecini1.in conține pe prima linie numerele n m; urmează n linii cu câte m numere naturale separate prin spații – elementele matricei.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.".Fișierul de ieșire vecini1.out va conține pe prima linie numărul C, reprezentând valoarea cerută. Î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 vor fi mai mici decât 1 000 000
  • considerăm că un element al matricei poate avea patru vecini: elementele situate pe aceeași linie și pe coloanele adiacente și elementele aflate pe aceeași coloană și liniile adiacente

Exemple

Exemplu 1

vecini1.in
4 5
6 6 4 6 6
2 2 6 4 6
1 1 7 3 6
6 3 6 5 6
vecini1.out
9

Explicatie

Cele 9 elemente sunt marcate mai jos:

6 6 4 6 6
2 2 6 4 6
1 1 7 3 6
6 3 6 5 6

Rezolvare

def citire_matrice():
    # Deschide fișierul de intrare și citește n, m și p
    with open("vecini1.in", "r") as fin:
        line = fin.readline().split()
        if len(line) != 2:
            print("Datele nu sunt conform restrictiilor impuse.")
            exit()
        n, m = map(int, line)
        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)

        return n, m, matrice


def vecini1(n, m, matrice):
    a = [[0] * (m + 2) for i in range(n + 2)]
    cnt = 0

    # Adăugarea de margini de numere mari în matrice
    for i in range(1, n + 1):
        for j in range(1, m + 1):
            a[i][j] = matrice[i-1][j-1]
        a[i][0] = 1000001
        a[i][m + 1] = 1000002
    for j in range(1, m + 1):
        a[0][j] = 1000003
        a[n + 1][j] = 1000004

    # Parcurgerea matricei pentru a verifica vecinii
    for i in range(1, n + 1):
        for j in range(1, m + 1):
            if a[i][j - 1] != a[i][j + 1] and a[i][j - 1] != a[i - 1][j] and a[i][j - 1] != a[i + 1][j] and a[i][j + 1] != a[i - 1][j] and a[i - 1][j] != a[i + 1][j] and a[i][j + 1] != a[i + 1][j]:
                cnt += 1

    return cnt


if _name_ == "_main_":
    n, m, matrice = citire_matrice()
    col_divizibile = vecini1(n, m, matrice)
    with open("vecini1.out", "w") as fout:
        fout.write(str(col_divizibile) + "\n")
    print("Numarul de elemente cu toti vecinii diferiti intre ei este:", col_divizibile)

Explicații

Acest cod este scris în limbajul de programare Python și conține două funcții:

Funcția citire_matrice():
Deschide fișierul "vecini1.in" și citește din el două numere întregi, n și m.
Verifică dacă valorile citite respectă restricțiile impuse (n și m trebuie să fie între 1 și 100).
Citește matricea de dimensiune n x m din fișier, verificând dacă valorile sunt conforme cu restricțiile (toate elementele matricei trebuie să fie mai mici sau egale cu 1000000).
Returnează dimensiunile matricei n și m, împreună cu matricea citită.
Funcția vecini1(n, m, matrice):
Inițializează o matrice a cu n+2 rânduri și m+2 coloane, toate inițializate cu valoarea 0.
Adaugă o margine de numere mari în jurul matricei matrice, astfel încât să fie mai ușor de verificat vecinii.
Parcurge matricea a și verifică dacă fiecare element are toți vecinii diferiți între ei.
În caz afirmativ, incrementeză numărul de astfel de elemente.
Returnează numărul de elemente cu toți vecinii diferiți între ei.
La final, se citește matricea din fișierul "vecini1.in", se apelează funcția vecini1() cu parametrii corespunzători și se scrie rezultatul în fișierul "vecini1.out". Rezultatul este afișat și în consolă