3244 - tabla: Difference between revisions
No edit summary |
|||
(One intermediate revision by the same user not shown) | |||
Line 46: | Line 46: | ||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python3" line="1"> | <syntaxhighlight lang="python3" line="1"> | ||
def calculeaza_punctaj(tabla): | def calculeaza_punctaj(tabla, n, i1, j1, i2, j2): | ||
punctaj = 0 | 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 | return punctaj | ||
def cel_mai_mare_punctaj(tabla, n): | |||
def | |||
max_punctaj = 0 | max_punctaj = 0 | ||
for | for i1 in range(n): | ||
for | 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 | # Citire date de intrare | ||
with open(" | with open("tablain.txt", "r") as file: | ||
n = int( | n = int(file.readline()) | ||
tabla = [list(map(int, | 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> | </syntaxhighlight> | ||
Latest revision as of 12:30, 29 December 2023
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.