0635 - Vecini 1
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
<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
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ă