Contact și feedback

Nu obții 100 de puncte sau ai nelămuriri în privința problemelor? Scrie-mi pe Instagram.


Ai găsit o greșeală, vrei să raportezi un utilizator sau vrei să comunici altceva? Folosește formularul de contact.


Vrei să ne transmiți o părere despre platformă? Folosește formularul de feedback.

Shortcuturi

Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.

Generale

Meniu shortcuturi?
Căutare probleme sau utilizatori/
Navigare printre rezultatele căutării↑, ↓
Meniu de contact și feedbackCTRL + Shift + F
Ieșire din meniuriEsc

Editor probleme

Setări editorCTRL + Shift + S
Schimbare stil editorCTRL + Shift + E
Șabloane de codCTRL + Shift + 1/2/3
Golire editorCTRL + Shift + 4

Nu te descurci?

Urmărește indicațiile pentru a înțelege cum se rezolvă problema.

Problemă verificată: Problemă de concurs certificată de InfoAs: Soluțiile tale trimise la această problemă sunt evaluate în exact același mediu ca și la concurs.

RAU Coder 2020 · Clasa a X-aStructuri de date liniareProbleme cu coadă

Problema JocDeSah

Grea (8 )

Memorie: 64 MB / 8 MB

Timp: 0.1 secunde

I/O: Fișiere

RAU-Gigel se gândește la un joc cu piesele de șah. El desenează o tablă de șah sub forma unei matrici pătratice de latură N și așează în fiecare dintre cele N × N celule câte o piesă de șah. Se consideră că dispune de N × N exemplare din fiecare piesă posibilă (regi, regine, ture, nebuni, cai, pioni), iar culoarea nu este relevantă. RAU-Gigel se întreabă care este numărul minim de căsuțe (celule) prin care trebuie să treacă un rege oarecare ca să ajungă la o regină oarecare. Regele se poate deplasa câte o celulă în patru direcții posibile: N, E, S, V.

Dar asta nu e tot. La începutul jocului, toți regii au 16 vieți. Atunci când RAU-Gigel mută un rege (oarecare) peste primul pion, acesta pierde o viață. Vestea bună este că, după aceea, regele respectiv poate lua oricâți pioni fără ca numărul său de vieți să fie afectat. Când ia un cal, regele pierde două vieți, dar după aceea poate lua, fără pierderi, oricâți cai. La fel se întâmplă și în cazul nebunilor, primul nebun îl costa patru vieți și, respectiv al turelor, care îl costă opt vieți.

RAU-Gigel dorește să afle ce rege să aleagă și pe ce traseu trebuie să meargă acesta către o regină oarecare, astfel încât la sfârșitul jocului să îi rămână cât mai multe vieți, iar traseul să fie cât mai scurt.

Cerință

Se cer:

  1. Care este numărul maxim de vieți cu care rămâne regele ales?
  2. Prin câte căsuțe trece traseul de lungime minimă? Ce rege mută și pe ce traseu? Dacă există mai multe drumuri de lungime minimă, atunci se va determina drumul mai mic alfanumeric (o celulă este mai mică alfanumeric decât altă celulă dacă se află pe un rând cu indice mai mic sau se află pe același rând cu cea de-a doua, dar pe o coloană cu indice mai mic).

Date de intrare

Fișierul de intrare jocdesah.in conține pe prima linie un număr natural A. Pentru toate testele de intrare, numărul A poate avea doar valoarea 1 sau valoarea 2. Pe al doilea rând se găsește numărul natural N, cu semnificația din enunț. Pe următoarele N linii se află câte N litere mari cu următoarea semnificație: P – pion, C – cal, N – nebun, T – tură, Q – regină și K – rege. Caracterele de pe fiecare rând nu au spații între ele.

Date de ieșire

Dacă valoarea lui A este 1, se va rezolva numai punctul a) din cerință. În acest caz, fișierul de ieșire jocdesah.out va conține un singur număr natural ce reprezintă numărul de vieți care îi rămân la sfârșitul jocului regelui ales de RAU-Gigel.

Dacă valoarea lui A este 2, se va rezolva numai punctul b) din cerință. În acest caz, fişierul de ieşire jocdesah.out va conține pe prima linie numărul natural K ce reprezintă numărul de căsuțe prin care trece regele ales (se numără atât căsuța din care pleacă, cât și cea în care ajunge), apoi pe următoarele K rânduri sunt perechi de forma i j (separate cu un singur spațiu) unde i și j reprezintă linia, respectiv coloana celulelor prin care trece regele (în ordinea de deplasare). Indexarea rândurilor și coloanelor se face de la 1 la N.

Restricții și precizări

  • 2 ≤ N ≤ 100
  • În fiecare test există cel puțin o literă K și cel puțin o literă Q
  • Pentru rezolvarea corectă a primei cerințe se acordă 45 de puncte

Exemple

2
6
PCQPNP
PCCCCP
QNPKPK
PCKPPP
NKPPPP
NNPPQP
5
3 4
3 5
4 5
5 5
6 5
1
6
PCQPNP
PCCCCP
QNPKPK
PCKPPP
NKPPPP
NNPPQP
15

Explicația exemplelor

Explicația primului exemplu
RAU-Gigel va alege să mute regele de pe poziția 3 4. Drumul va trece prin 5 celule (va număra inclusiv celulele de plecare și sosire), iar acestea sunt: 3 4, 3 5, 4 5, 5 5, 6 5. În drumul său a luat doar pioni, deci a pierdut o singură viață, i-au rămas 15:

* * * * * *
* * * * * *
* * * K P *
* * * * P *
* * * * P *
* * * * Q *

Se observă că mai există un drum de lungime 5 care îl costă tot o singură viață:

* * * * * *
* * * * * *
* * * K * *
* * * P P *
* * * * P *
* * * * Q *

Drumul este 3 4, 4 4, 4 5, 5 5, 6 5, dar el este mai mic alfanumeric decât 3 4, 3 5, 4 5, 5 5, 6 5 (perechea 3 5 e mai mică alfanumeric decât perechea 4 4).

De asemenea, un alt drum este: 3 4, 3 3, 3 2, 3 1:

* * * * * *
* * * * * *
Q N P K * *
* * * * * *
* * * * * *
* * * * * *

Acesta chiar mai scurt (trece prin numai 4 căsuțe), totuși pe acest drum regele ar ataca un pion și un nebun, care l-ar costa 1 + 4 = 5 vieți și ar rămâne cu numai 11, de aceea nu îl va alege.

Problemă adăugată pe InfoAs de  Poza de profil a utilizatorului @concursuriOlimpiade și concursuri

Se încarcă…

Se încarcă…

Se încarcă…

Se încarcă…

Rezolvarea ta


							

Nu ești logat!

Loghează-te pentru a putea testa rezolvarea ta la această problemă.

Posibile greșeli

Am detectat următoarele posibile greșeli în codul tău. De regulă, aceste greșeli trec de compilare, însă au un comportament impredictibil în evaluarea codului (ducând astfel la punctaje mai mici).


    Setări editor

    Stil editor (CTRL + Shift + E)

    Atenție: Pe ecranele mici, schimbarea stilului editorului nu are niciun efect.


    Afișează confetti

    De ce nu iau 100 de puncte?

    Răspuns greșit

    Dacă răspunsul tău la un test este 100% corect, dar totuși este marcat ca fiind greșit, poate fi din următoarele cauze:


    Afișezi și alte lucruri. De exemplu, dacă vrei să citești un număr de la tastatură, corect este cin >> n;, iar greșit este cout << "n="; cin >> n; – mai precis, nu afișa niciun mesaj când faci citirea, deoarece este considerat parte din răspuns. Asemănător și pentru afișare (doar răspunsul trebuie afișat, exact cum este specificat în cerință, nimic altceva).


    Nu dai o valoare de început unei variabile locale. În CodeBlocks, când rulezi un program, există posibilitatea ca variabilele declarate în int main() fără o valoare de început, de pildă int nr;, să le fie atribuite valoarea 0. Acest lucru nu este deloc garantat în majoritatea mediilor de programare, de regulă aceste variabile având valori aleatorii. Astfel, este indicat să dai o valoare implicită tuturor variabilelor pe care le declari în int main(), în special cele de contorizare: int nr = 0;.


    Nu afișezi unde trebuie. La această problemă, citirea și afișarea se realizează din fișiere. Poate citești și afișezi prin consolă


    Probleme cu memoria (în special la vectori sau matrici). De regulă, problemele de memorie dau fatal signal 11 (vezi mai jos pentru detalii). Însă, există posibilitatea să existe anumite erori mai subtile, care totuși dau răspuns greșit în ciuda faptului că este o problemă de memorie. Un exemplu ar fi, în anumite condiții, declararea unui vector int a[100]; și efectuarea diferitelor operații cu poziția a[100] a sa (vectorul are doar poziții de la 0 la 99, dar accesăm poziția 100).


    Caught fatal signal 11

    Probleme cu memoria (în special la vectori sau matrici). Această eroare apare când încerci să accesezi zone de memorie interzise, sau în general făcând lucruri dubioase cu memoria. Iată câteva exemple tipice:


    Depășești limita de memorie. Fiecare problemă are o limită de memorie, care, de regulă, este destul de generoasă. Există șansa să depășești totuși limita de memorie, fapt care duce la această eroare. Un exemplu ar fi ca, la o problemă cu limita impusă de 2 MB, să fie declarat un vector int a[1000000]; (cu un milion de elemente), care are aproximativ 3.81 MB.


    Caught fatal signal 4 / caught fatal signal 8

    Împarți un număr la zero. Această eroare apare doar dacă, undeva în cod, împarți la 0. Poate fi ori evident (ai scris n /= 0; în loc de n /= 10;, de exemplu), ori poate fi mai subtil (ai o variabilă x care, cumva, reușește să ia valoarea 0, și efectuezi n / x).


    Extragi rădăcina pătrată dintr-un număr negativ. Această eroare apare doar dacă, undeva în cod, aplici sqrt(n), unde n este un număr negativ. Poate fi ori evident (ai scris sqrt(-4); în loc de sqrt(4);, de exemplu), ori poate fi mai subtil (ai o variabilă x care, cumva, reușește să ia o valoare negativă, și efectuezi sqrt(x)).


    Eroare de compilare (E.C.)

    Codul tău conține o eroare de scriere. Nu am apucat să îți testăm codul, deoarece acesta conține o greșeală – sub mesajul Eroare de compilare se află o explicație unde poți să vezi exact pe ce linii ai erori. Cel mai probabil ai uitat să pui un ; (punct și virgulă) pe undeva, sau ai uitat să incluzi o bibliotecă.


    Altă eroare

    Dacă ați întâmpinat altă eroare, ne puteți informa pe formularul de feedback.

    Înainte să continui…

    Urmează să rezolvi prima ta problemă pe InfoAs! Asigură-te că nu afișezi niciun alt mesaj decât ceea ce îți cere problema, altfel, vei obține răspuns greșit. De pildă:

    Iconita warning Nu trebuie afișat mesajul "Suma este "! Se vor obține 0 puncte, pentru răspuns greșit.

    cout << "Suma este " << s;

    Iconita bine Afișarea este corectă.

    cout << s;