3244 - tabla
Enunt[edit | edit source]
O tablă de șah de dimensiune n x n conține pe toate pătrățelele câte o piesă cu una din culorile: alb, negru, roșu, verde sau albastru. Pe tablă nu există 3 piese consecutive pe aceeași linie sau coloană de aceeași culoare. O mutare presupune interschimbarea a două piese alăturate, fie pe o linie, fie pe o coloană. După mutare se acordă punctaj dacă se obțin următoarele situații și nu numai:
- 3 piese de aceeași culoare consecutive pe o linie sau o coloană = 1 punct;
- 3 piese de aceeași culoare consecutive pe o linie și o coloană = 5 puncte;
La orice situație de mai sus, o piesă în plus de aceeași culoare mai contribuie cu încă 1 la punctaj. De exemplu, 4 piese de aceeași culoare consecutive pe o linie sau o coloană = 2 puncte. Punctajele obținute de piesele interschimbate se adună. Punctajul este 0 dacă nu se obțin măcar 3 piese consecutive de aceeași culoare.
Cerinta[edit | edit source]
Găsiți cel mai mare punctaj obținut în urma unei singure mutări.
Date de intrare[edit | edit source]
Fișierul de intrare tablain.txt conține, pe prima linie, numărul natural n, ce reprezintă dimensiunea tablei. Pe fiecare dintre următoarele n linii se află câte n valori separate prin spatii. Valorile posibile pot fi: 1, 2, 3, 4 și 5. Valoarea 1 reprezintă piesa de culoare albă, 2 piesa de culoare neagră etc.
Date de iesire[edit | edit source]
Fișierul de ieșire tablaout.txt va conține cel mai mare punctaj obținut.
Restrictii si precizari[edit | edit source]
- 1 ⩽ n ⩽ 20
Exemplul 1[edit | edit source]
- tablain.txt
- 3
- 1 1 2
- 2 2 1
- 3 4 5
- tablaout.txt
- Datele introduse corespund restrictiilor impuse
- 2
Exemplul 2[edit | edit source]
- tablain.txt
- 3
- 0 0 0
- -10 23 3
- 1 72 0
- Datele introduse nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def calculeaza_punctaj(tabla, n, i1, j1, i2, j2):
punctaj = 0
# Verificare pe linii if i1 < n - 2 and tabla[i1][j1] == tabla[i1 + 1][j1] == tabla[i1 + 2][j1]: punctaj += 1 if i2 < n - 2 and tabla[i2][j2] == tabla[i2 + 1][j2] == tabla[i2 + 2][j2]: punctaj += 1
# Verificare pe coloane if j1 < n - 2 and tabla[i1][j1] == tabla[i1][j1 + 1] == tabla[i1][j1 + 2]: punctaj += 1 if j2 < n - 2 and tabla[i2][j2] == tabla[i2][j2 + 1] == tabla[i2][j2 + 2]: punctaj += 1
# Verificare pe diagonale if i1 < n - 2 and j1 < n - 2 and tabla[i1][j1] == tabla[i1 + 1][j1 + 1] == tabla[i1 + 2][j1 + 2]: punctaj += 1 if i2 < n - 2 and j2 < n - 2 and tabla[i2][j2] == tabla[i2 + 1][j2 + 1] == tabla[i2 + 2][j2 + 2]: punctaj += 1
return punctaj
def cel_mai_mare_punctaj(tabla, n):
max_punctaj = 0
for i1 in range(n): for j1 in range(n): for i2 in range(i1, n): for j2 in range(n): # Pentru fiecare pereche de piese alaturate, calculam punctajul if (i1 != i2 or abs(j1 - j2) != 1) and (j1 != j2 or abs(i1 - i2) != 1): tabla[i1][j1], tabla[i2][j2] = tabla[i2][j2], tabla[i1][j1] punctaj = calculeaza_punctaj(tabla, n, i1, j1, i2, j2) max_punctaj = max(max_punctaj, punctaj) tabla[i1][j1], tabla[i2][j2] = tabla[i2][j2], tabla[i1][j1] # revenire la starea initiala
return max_punctaj
def verificare_date_intrare(n, tabla):
if not (1 <= n <= 20): return False
for i in range(n): if len(tabla[i]) != n or not all(1 <= tabla[i][j] <= 5 for j in range(n)): return False
return True
- Citire date de intrare
with open("tablain.txt", "r") as file:
n = int(file.readline()) tabla = [list(map(int, file.readline().split())) for _ in range(n)]
- Verificare date de intrare
if not verificare_date_intrare(n, tabla):
print("Datele introduse nu corespund restricțiilor impuse")
else:
# Calcul si afisare rezultat rezultat = cel_mai_mare_punctaj(tabla, n) with open("tablaout.txt", "w") as file: file.write(str(rezultat) + "\n")
</syntaxhighlight>
Explicatie[edit | edit source]
Prin interschimbarea elementului (1,3) cu (2,3) se obține:
- 1 1 1
- 2 2 2
- 3 4 5
și am 1 punct din prima linie și 1 punct din a doua linie.