0969 - Culori1
Enunț[edit | edit source]
Într-o cameră sunt aşezate n*m acvarii identice, pe n rânduri, câte m pe fiecare rând, unul lângă altul. În fiecare acvariu se află un singur peşte. Peştele poate fi de culoare roşie (culoare codificată cu r) sau albastră (codificată cu a). La fiecare moment de timp t=1,2,3,.., peştii îşi modifică simultan culoarea astfel: fiecare peşte se colorează în culoarea pe care au avut-o la momentul t-1 majoritatea peştilor din acvariile învecinate (ca în desenul de mai jos, sunt cel mult 8 acvarii vecine notate cu V1, V2, V3,…, V8). În cazul în care numărul peştilor vecini roşii este egal cu numărul peştilor vecini albaştrii, peştele studiat îşi va păstra culoarea.
Cerința[edit | edit source]
Scrieţi un program care să citească numerele naturale n, m, t şi cele n*m coduri ale culorilor peştilor (cele de la momentul iniţial t=0) şi care să determine şi să afişeze codurile culorilor peştilor de la momentul t.
Date de intrare[edit | edit source]
Fișierul de intrare culori1in.txt conține
- pe prima linie numerele naturale n, m şi t, separate printr-un singur spaţiu, cu semnificaţia din enunț
- pe următoarele n linii se află câte m caractere r sau a, pentru fiecare rând de acvarii, format astfel:
- dacă peştele din acvariul cu numărul de ordine i (1≤i≤m) din rândul curent este roşu, atunci cel de-al i-lea caracter din linia fişierului de intrare, corespunzătoare rândului curent, este r
- dacă peştele din acvariul cu numărul de ordine i (1≤i≤m) din rândul curent este albastru atunci cel de-al i-lea caracter din linia fişierului de intrare, corespunzătoare rândului curent, este a
Date de ieșire[edit | edit source]
Fișierul de ieșire culori1out.txt va conține n linii, fiecare linie va conţine câte m caractere r sau a, reprezentând codurile culorilor peştilor din rândul corespunzător numărului liniei curente din fişier.
Restricții și precizări[edit | edit source]
- 2 ⩽ n, m ⩽ 49
- 1 ⩽ t ⩽ 2.300.000
Exemplul 1[edit | edit source]
- Intrare
- culori1in.txt
- 3 3 1
- rar
- rra
- arr
- Ieșire
- Datele de intrare corespund restricțiilor impuse
- culori1out.txt
- rra
- rrr
- rrr
Exemplul 2[edit | edit source]
- Intrare
- culori1in.txt
- 4 5 3
- rrara
- aarra
- aarrr
- rrraa
- Ieșire
- Datele de intrare corespund restricțiilor impuse
- culori1out.txt
- aarrr
- aarrr
- rrrrr
- rrrrr
Exemplul 3[edit | edit source]
- Intrare
- culori1in.txt
- 1 5 3
- rrara
- aarra
- aarrr
- rrraa
- Ieșire
- Datele de intrare NU corespund restricțiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 0969 - Culori1
def validare_date_intrare(n, m, t, culori):
if not (2 <= n < 50 and 2 <= m < 50): return False if not (1 <= t <= 2300000): return False if len(culori) != n: return False for linie in culori: if len(linie) != m: return False if not all(caracter in {'r', 'a'} for caracter in linie): return False return True
def modifica_culori(n, m, t, culori):
directii = [(-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1)]
def numar_vecini(x, y): vecini_rosii = 0 vecini_albastri = 0 for dx, dy in directii: nx, ny = x + dx, y + dy if 0 <= nx < n and 0 <= ny < m: if culori[nx][ny] == 'r': vecini_rosii += 1 elif culori[nx][ny] == 'a': vecini_albastri += 1 return vecini_rosii, vecini_albastri
def actualizeaza_culoare(x, y): vecini_rosii, vecini_albastri = numar_vecini(x, y) if vecini_rosii > vecini_albastri: return 'r' elif vecini_rosii < vecini_albastri: return 'a' else: return culori[x][y]
for _ in range(t): noua_culoare = [[] * m for _ in range(n)] for i in range(n): for j in range(m): noua_culoare[i][j] = actualizeaza_culoare(i, j) culori = [.join(row) for row in noua_culoare]
return culori
if __name__ == "__main__":
with open("culori1in.txt", "r") as fin: n, m, t = map(int, fin.readline().split()) culori = [fin.readline().strip() for _ in range(n)]
if validare_date_intrare(n, m, t, culori): print("Datele de intrare corespund restricțiilor impuse") rezultat = modifica_culori(n, m, t, culori) with open("culori1out.txt", "w") as fout: fout.write('\n'.join(rezultat)) else: print("Datele de intrare NU corespund restricțiilor impuse") exit(0)
</syntaxhighlight>