0969 - Culori1

De la Universitas MediaWiki

Enunț

Î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

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

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

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

  • 2 ⩽ n, m ⩽ 49
  • 1 ⩽ t ⩽ 2.300.000

Exemplul 1

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

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

Intrare
culori1in.txt
1 5 3
rrara
aarra
aarrr
rrraa
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare

#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)