3430 - Bpj 2020

De la Universitas MediaWiki
Versiunea din 30 iulie 2024 15:06, autor: RaulOtet (discuție | contribuții) (Pagină nouă: Gigel a descoperit noul joc Block Puzzle Jewel. Jocul se desfășoară astfel: * avem o tablă de joc sub forma unei matrice <code>8x8</code>; * sunt <code>17</code> tipuri de piese care arată așa: * după ce Gigel adaugă o piesa, pătrățelele din care este formată piesa vor ocupa zonele corespunzătoare din tabla de joc iar, iar numărul de pătrățele din care este formată piesa se va adăuga la scorul lui Gigel. De exemplu, dacă Gigel vrea să mute o piesă de t...)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

Gigel a descoperit noul joc Block Puzzle Jewel. Jocul se desfășoară astfel:

  • avem o tablă de joc sub forma unei matrice 8x8;
  • sunt 17 tipuri de piese care arată așa:
  • după ce Gigel adaugă o piesa, pătrățelele din care este formată piesa vor ocupa zonele corespunzătoare din tabla de joc iar, iar numărul de pătrățele din care este formată piesa se va adăuga la scorul lui Gigel. De exemplu, dacă Gigel vrea să mute o piesă de tipul 16 atunci ea va ocupa locurile m[i][j] , m[i][j+1] , m[i][j+2] , m[i+1][j+2] și m[i+2][j+2] iar scorul lui Gigel va crește cu 5 puncte sau dacă Gigel vrea să mute o piesă de tipul 15 atunci ea va ocupa locurile m[i][j] , m[i][j+1] , m[i+1][j-1] și m[i+1][j] iar scorul lui Gigel va crește cu 4 puncte.
  • dacă o linie sau o coloana este completată cu pătratele atunci ea se eliberează (se elimină pătrățelele care ocupă linia/coloana).
  • modul de a pozitiona o piesă este așa : a l c, unde a este tipul piesei, l și c reprezintă linia și coloana unde se va afla pătrățelul din stânga sus al piesei respective în matrice
  • Dacă la o mutare se elimină:
    • o linie sau o coloană , atunci Gigel primeste 10 puncte
    • 2 linii și coloane liberate, atunci Gigel primește 30 de puncte
    • 3 linii și coloane eliberate, atunci Gigel primește 60 de puncte
    • 4 linii și coloane eliberate, atunci Gigel primește 100 de puncte
    • 5 linii și coloane eliberate, atunci Gigel primește 150 de puncte
    • 6 linii și coloane eliberate, atunci Gigel primește 500 de puncte

Dându-se n, numărul de piese pe care le va muta Gigel și piesele pe care le va muta Gigel (folosind numerele a, l și c), să se determine scorul final al lui Gigel.

Date de intrare

Fișierul de intrare bpj2020.in conține pe prima linie numărul n, iar pe următoarele n linii câte 3 numere a l c cu semnificația din enunț.

Date de ieșire

Fișierul de ieșire bpj2020.out va conține pe prima linie numărul S, reprezentând scorul final al lui Gigel.

Restricții și precizări

  • 1 ≤ n ≤ 50
  • 1 ≤ l , c ≤ 8
  • 1 ≤ a ≤ 17
  • nu o să existe o piesa suprapusă peste alta și nici piese care să iasă din tabla de joc
  • la început tabla de joc este goală

Exemplu

bpj2020.in

9
17 7 1
5 8 4
3 7 2
10 5 5
12 4 4
1 6 4
7 4 1
6 5 6
16 4 6

bpj2020.out

108
# Definirea pieselor și pozițiilor lor relative
pieces = {
    1:  [(0, 0)],
    2:  [(0, 0), (0, 1)],
    3:  [(0, 0), (1, 0)],
    4:  [(0, 0), (0, 1), (1, 0)],
    5:  [(0, 0), (0, 1), (0, 2)],
    6:  [(0, 0), (1, 0), (2, 0)],
    7:  [(0, 0), (0, 1), (1, 1)],
    8:  [(0, 0), (1, 0), (1, 1)],
    9:  [(0, 0), (0, 1), (1, 0), (1, 1)],
    10: [(0, 0), (0, 1), (0, 2), (1, 0)],
    11: [(0, 0), (0, 1), (0, 2), (1, 2)],
    12: [(0, 0), (1, 0), (1, 1), (1, 2)],
    13: [(0, 0), (1, 0), (2, 0), (2, 1)],
    14: [(0, 0), (1, 0), (2, 0), (2, -1)],
    15: [(0, 0), (0, 1), (1, -1), (1, 0)],
    16: [(0, 0), (0, 1), (0, 2), (1, 2), (2, 2)],
    17: [(0, 0), (1, 0), (2, 0), (2, 1), (2, 2)],
}

def check_and_clear(board, n):
    cleared_lines = 0
    rows_to_clear = [i for i in range(n) if all(board[i][j] for j in range(n))]
    cols_to_clear = [j for j in range(n) if all(board[i][j] for i in range(n))]

    for row in rows_to_clear:
        for j in range(n):
            board[row][j] = 0
        cleared_lines += 1

    for col in cols_to_clear:
        for i in range(n):
            board[i][col] = 0
        cleared_lines += 1

    score_bonus = [0, 10, 30, 60, 100, 150, 500]
    return cleared_lines, score_bonus[cleared_lines]

def play_game(n, moves):
    board = [[0] * 8 for _ in range(8)]
    score = 0

    for a, l, c in moves:
        for dx, dy in pieces[a]:
            x, y = l + dx - 1, c + dy - 1
            board[x][y] = 1
            score += 1

        cleared_lines, bonus = check_and_clear(board, 8)
        score += bonus

    return score

# Citirea inputului
n = int(input())
moves = [tuple(map(int, input().split())) for _ in range(n)]

# Calcularea scorului final
final_score = play_game(n, moves)
print(final_score)