3244 - tabla: Difference between revisions

From Bitnami MediaWiki
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
    n = len(tabla)


     for i in range(n):
     # Verificare pe linii
         for j in range(n - 2):
    if i1 < n - 2 and tabla[i1][j1] == tabla[i1 + 1][j1] == tabla[i1 + 2][j1]:
            # Verificare pe linii
         punctaj += 1
            if tabla[i][j] == tabla[i][j + 1] == tabla[i][j + 2]:
    if i2 < n - 2 and tabla[i2][j2] == tabla[i2 + 1][j2] == tabla[i2 + 2][j2]:
                punctaj += 1
        punctaj += 1
                if j + 3 < n and tabla[i][j] == tabla[i][j + 3]:
 
                    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 coloane
    # Verificare pe diagonale
            if tabla[j][i] == tabla[j + 1][i] == tabla[j + 2][i]:
    if i1 < n - 2 and j1 < n - 2 and tabla[i1][j1] == tabla[i1 + 1][j1 + 1] == tabla[i1 + 2][j1 + 2]:
                punctaj += 1
        punctaj += 1
                if j + 3 < n and tabla[j][i] == tabla[j + 3][i]:
    if i2 < n - 2 and j2 < n - 2 and tabla[i2][j2] == tabla[i2 + 1][j2 + 1] == tabla[i2 + 2][j2 + 2]:
                    punctaj += 1
        punctaj += 1


     return punctaj
     return punctaj


 
def cel_mai_mare_punctaj(tabla, n):
def maxim_punctaj_dupa_mutare(tabla):
    n = len(tabla)
     max_punctaj = 0
     max_punctaj = 0


     for i in range(n):
     for i1 in range(n):
         for j in range(n - 1):
         for j1 in range(n):
             # Efectuare interschimbare pe linii
             for i2 in range(i1, n):
            tabla[i][j], tabla[i][j + 1] = tabla[i][j + 1], tabla[i][j]
                for j2 in range(n):
            punctaj_linii = calculeaza_punctaj(tabla)
                    # 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


            # Efectuare interschimbare pe coloane
    return max_punctaj
            tabla[i][j], tabla[i][j + 1] = tabla[i][j + 1], tabla[i][j]
            tabla[j][i], tabla[j + 1][i] = tabla[j + 1][i], tabla[j][i]
            punctaj_coloane = calculeaza_punctaj(tabla)


            # Restaurare tabla la starea initiala
def verificare_date_intrare(n, tabla):
            tabla[i][j], tabla[i][j + 1] = tabla[i][j + 1], tabla[i][j]
    if not (1 <= n <= 20):
            tabla[j][i], tabla[j + 1][i] = tabla[j + 1][i], tabla[j][i]
        return False


            # Actualizare punctaj maxim
    for i in range(n):
            max_punctaj = max(max_punctaj, punctaj_linii, punctaj_coloane)
        if len(tabla[i]) != n or not all(1 <= tabla[i][j] <= 5 for j in range(n)):
 
            return False
    return max_punctaj


    return True


# Citire date de intrare
# Citire date de intrare
with open("tabla.txt", "r") as fin:
with open("tablain.txt", "r") as file:
     n = int(fin.readline())
     n = int(file.readline())
     tabla = [list(map(int, fin.readline().split())) for _ in range(n)]
     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")


# Calcul maxim punctaj dupa o mutare
rezultat = maxim_punctaj_dupa_mutare(tabla)


# Scriere rezultat in fisier
with open("tabla.txt", "w") as fout:
    fout.write(str(rezultat))
</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
  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.