3430 - Bpj 2020
Gigel a descoperit noul joc Block Puzzle Jewel. Jocul se desfășoară astfel:
- avem o tablă de joc sub forma unei matrice
8x8; - sunt
17tipuri 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
16atunci ea va ocupa locurilem[i][j],m[i][j+1],m[i][j+2],m[i+1][j+2]șim[i+2][j+2]iar scorul lui Gigel va crește cu5puncte sau dacă Gigel vrea să mute o piesă de tipul15atunci ea va ocupa locurilem[i][j] , m[i][j+1] , m[i+1][j-1]șim[i+1][j]iar scorul lui Gigel va crește cu4puncte. - 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, undeaeste tipul piesei,lșicreprezintă 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
10puncte 2linii și coloane liberate, atunci Gigel primește30de puncte3linii și coloane eliberate, atunci Gigel primește60de puncte4linii și coloane eliberate, atunci Gigel primește100de puncte5linii și coloane eliberate, atunci Gigel primește150de puncte6linii și coloane eliberate, atunci Gigel primește500de puncte
- o linie sau o coloană , atunci Gigel primeste
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 ≤ 501 ≤ l , c ≤ 81 ≤ 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
<syntaxhighlight lang="python" line="1">
- 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) </syntaxhighlight>