0635 - Vecini 1

From Bitnami MediaWiki
Revision as of 12:14, 22 April 2023 by Andor Giulia (talk | contribs) (Pagină nouă: Sursă: [https://www.pbinfo.ro/probleme/635/vecini1] == 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 == D...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursă: [1]

Cerinţa[edit | edit source]

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

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

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

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

Exemplu 1[edit | edit source]

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

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

<syntaxhighlight lang="python" line="1"> 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)

</syntaxhighlight>

Explicații[edit | edit source]

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ă