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.
Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.
Meniu shortcuturi | ? |
Căutare probleme sau utilizatori | / |
Navigare printre rezultatele căutării | ↑, ↓ |
Meniu de contact și feedback | CTRL + Shift + F |
Ieșire din meniuri | Esc |
Setări editor | CTRL + Shift + S |
Schimbare stil editor | CTRL + Shift + E |
Șabloane de cod | CTRL + Shift + 1/2/3 |
Golire editor | CTRL + Shift + 4 |
RAU Coder 2020 · Clasa a X-aStructuri de date liniareProbleme cu coadă
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.
Se cer:
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.
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
.
2 ≤ N ≤ 100
K
și cel puțin o literă Q
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 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 Olimpiade și concursuri
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).
Atenție: Pe ecranele mici, schimbarea stilului editorului nu are niciun efect.
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
).
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:
int a[100];
și accesând poziții care nu sunt între 0
și 99
(de exemplu a[105]
, a[9999999999]
sau chiar și a[-5]
); asemănător și pentru matrici.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
.
Î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)
).
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ă.
Dacă ați întâmpinat altă eroare, ne puteți informa pe formularul de feedback.
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ă:
Afișarea este corectă.
cout << s;
Nu trebuie afișat mesajul "Suma este "! Se vor obține 0 puncte, pentru răspuns greșit.
cout << "Suma este " << s;