
Cerință
Se dă o matrice de dimensiune , în care toate celulele au inițial valoarea . Liniile și coloanele sunt indexate de la la .
O celulă cu valoarea este considerată goală. O celulă cu valoare nenulă conține un bloc, iar valoarea celulei este valoarea blocului respectiv.
Inițial nu există niciun bloc în matrice.
Trebuie să afișați o listă de comenzi care vor fi executate, în ordine, asupra matricei. Scopul este să obțineți o celulă cu valoare cât mai mare.
Există două tipuri de comenzi:
DROP: adaugă un bloc nou de valoare în celula . Această comandă este validă doar dacă celula este goală, adică are valoarea .LEFT,RIGHT,UP,DOWN: deplasează toate blocurile din matrice în direcția indicată.
Comenzile sunt simulate de evaluator în ordinea în care sunt afișate. După executarea tuturor comenzilor, punctajul este determinat de valoarea maximă aflată în matrice.
Regula de deplasare
La o comandă de tip LEFT, RIGHT, UP sau DOWN, toate blocurile se deplasează simultan cât mai mult posibil în direcția aleasă.
Pentru fiecare linie sau coloană afectată de direcția mutării, se iau valorile nenule în ordinea deplasării:
- pentru
LEFT, fiecare linie se citește de la stânga la dreapta; - pentru
RIGHT, fiecare linie se citește de la dreapta la stânga; - pentru
UP, fiecare coloană se citește de sus în jos; - pentru
DOWN, fiecare coloană se citește de jos în sus.
Celulele goale, adică valorile , sunt ignorate inițial. Apoi lista obținută este parcursă în ordinea deplasării.
Dacă două valori consecutive sunt egale, ele se unesc într-un singur bloc, cu valoarea egală cu suma lor. Cele două blocuri dispar, iar în locul lor apare un singur bloc.
Un bloc obținut printr-o unire nu se mai poate uni încă o dată în aceeași mutare.
După efectuarea tuturor unirilor pentru linia sau coloana respectivă, blocurile rămase sunt așezate cât mai aproape de marginea spre care se face deplasarea, iar restul celulelor devin .
Exemple de deplasare
Pentru comanda LEFT, o linie se transformă astfel:
.
Primele două blocuri de valoare se unesc într-un bloc de valoare , iar al treilea bloc de valoare rămâne separat.
De asemenea,
.
Nu se obține , deoarece un bloc nou format prin unire nu se mai poate uni în aceeași mutare.
Un alt exemplu este:
.
Pentru comanda RIGHT, linia
devine
.
Se observă că unirile se fac în direcția deplasării.
Date de intrare
Nu există date de intrare.
Matricea inițială este întotdeauna:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
Date de ieșire
Afișați pe linii separate câte o comandă. Fiecare comandă trebuie să fie una dintre: DROP, LEFT, RIGHT, UP, DOWN.
Evaluatorul va executa comenzile în ordinea afișată.
Restricții și precizări
- Matricea este întotdeauna de dimensiune .
- Valoarea inițială a tuturor celulelor este .
- .
- Comanda
DROPeste validă doar dacă celula are valoarea înainte de executarea comenzii. - Dacă se execută
DROPatunci când celula nu este goală, soluția este considerată invalidă. - Comenzile de deplasare sunt permise chiar dacă nu schimbă matricea.
Punctare
Scorul este calculat în funcție de valoarea maximă obținută în matrice după executarea tuturor comenzilor.
| Valoare maximă obținută | Punctaj |
|---|---|
De exemplu, dacă valoarea maximă obținută este , se acordă de puncte.
Exemplu
stdout
DROP
UP
DROP
UP
DROP
UP
DROP
UP
UP
LEFT
Explicație
Inițial, matricea este goală.
După prima comandă DROP, apare un bloc de valoare în celula .
Comanda UP mută acest bloc în partea de sus a coloanei .
Repetând comenzile DROP și UP, se pot obține mai multe blocuri pe coloana din dreapta.
Blocurile egale care ajung vecine în direcția deplasării se unesc.
După primele comenzi din exemplu, pe coloana a patra se obține un bloc de valoare și apoi încă un bloc de valoare . Comanda UP le unește într-un bloc de valoare . Apoi comanda LEFT mută acest bloc spre stânga.
Valoarea maximă obținută în acest exemplu este .