0969 - Culori1

From Bitnami MediaWiki

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>

  1. 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>