Rezolvare completă PbInfo #1614 Litere1

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 este 1, fişierul de ieşire litere1.out va conţine un număr natural, reprezentând numărul de caractere * din figură.
  • Dacă valoarea lui P este 2, fişierul de ieşire litere1.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 este 3, fişierul de ieşire litere1.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 Adresa de email.

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!