3244 - tabla

From Bitnami MediaWiki

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