Un copil dorește să găsească un mod original de a-și codifica numele și folosește în acest scop o figură formată doar din triunghiuri, desenată pe o foaie de hârtie. El plasează fiecare literă din numele său, în câte un triunghi. Dacă numele lui este DARIUS
, atunci foaia de hârtie va arăta ca în figura 1. Pe primul rând așează prima literă, pe al doilea rând următoarele trei litere, pe al treilea rând următoarele cinci litere, și așa mai departe până când așează toate literele din nume. Dacă numele nu are suficiente litere, copilul folosește caracterul *
pentru a completa ultimul rând pe care pe care a așezat litere. Nemulțumit că numele poate fi citit relativ ușor, răstoarnă figura, rotind foaia de hârtie, în sensul acelor de ceasornic, obținând astfel figura 2.
Cerințe
Cunoscând literele numelui, scrieți un program care determină și afișează în fișierul de ieșire:
1. Numărul de caractere *
pe care trebuie să le utilizeze pentru a completa ultimul rând;
2. Prima literă de pe fiecare rând din figura inițială;
3. Șirul literelor de pe fiecare rând, după rotirea foii de hârtie.
Date de intrare
Fișierul de intrare litere1.in
conține pe prima linie un număr natural P
reprezentând cerința din problemă care trebuie rezolvată, pe a doua linie un număr natural N
, reprezentând numărul de litere din nume. Pe a treia linie din fișier se află numele copilului format din N
litere, majuscule din alfabetul englez. Literele sunt separate între ele prin câte un spațiu.
Date de ieșire
- Dacă valoarea lui
P
este1
, fişierul de ieşirelitere1.out
va conţine un număr natural, reprezentând numărul de caractere*
din figură. - Dacă valoarea lui
P
este2
, fişierul de ieşirelitere1.out
va conţine, pe o singură linie, un șir de litere, separate între ele prin câte un spațiu, format din prima literă de pe fiecare rând al figurii, înainte de rotirea sa, începând cu primul rând până la ultimul. - Dacă valoarea lui
P
este3
, fişierul de ieşirelitere1.out
va conţine literele obținute după rotirea figurii inițiale, afișarea făcându-se în ordine de sus în jos, iar în cadrul unui rând, în ordine de la stânga la dreapta. Fiecare rând de litere va fi afișat în fișier pe câte o linie, iar literele situate pe același rând vor fi separate între ele prin câte un spațiu.
Restricții și precizări
1 ≤ n ≤ 10000
Exemplul 1
litere1.in
1 6 D A R I U S
litere1.out
3
Explicație
Pentru scrierea numelui DARIUS
se vor completa 3
rânduri, formate din 9
triunghiuri, dintre care 3
vor conține caracterul *
.
Exemplul 2
litere1.in
2 6 D A R I U S
litere1.out
D A U
Explicație
Prima literă de pe primul rând este D
, prima literă de pe rândul 2 este A
, prima literă de pe rândul 3 este U
.
Exemplul 3
litere1.in
3 6 D A R I U S
litere1.out
U S A I R D
Explicație
După rotire, pe primul rând se află litera U
, pe al doilea rând literele S A
, iar pe rândul al treilea, în ordine de la stânga la dreapta, literele I R D
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Litere1:
#include <fstream>
using namespace std;
ifstream fin("litere1.in");
ofstream fout("litere1.out");
int ord[10001],p,n,i,j,pas,k,x;
char v[10001];
int main()
{
fin>>p>>n;
for(i=1;i<=n;i++) fin>>v[i];
if(p==1)///1- nr de * de pe ultimul nivel
{
x=1;
while(x*x<n)x++;
fout<<x*x-n<<'\n';return 0;
}
if(p==2)///2- afisam prima litera de pe fiecare nivel
{
x=0;
while(x*x<n) {fout<<v[x*x+1]<<" ";x++;}
return 0;
}
/// 3 - ordinea literelor dupa rotire
x=1;
while(x*x<n) x++;
for(i=x*x;i>n;i--) v[i]='*';
ord[1]=(x-1)*(x-1)+1; k=1;ord[0]=0;
for(i=2;i<=x;i++)///i este nivelul
{
j=ord[1]+2*i-2;pas=2*x-1;
for(;k<i*i-1;j-=pas,pas-=2)
{
ord[++k]=j;ord[++k]=j-1;
}
ord[++k]=j;
}
for(i=1,j=1;i<=x;i++)
{
for(;j<i*i;j++)
if(v[ord[j]]!='*')fout<<v[ord[j]]<<" ";
fout<<v[ord[j++]]<<'\n';
}
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1614 Litere1
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1614 Litere1 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!