Informatică, întrebare adresată de claudianastasiu, 8 ani în urmă

Mihnea este un producător muzical și compune versurile pentru melodiile marilor artiști. Când compune o piesă, acesta scrie fiecare cuvant pe un rând diferit, pentru a-i fi mai ușor să creeze rime si să facă modificările necesare versurilor. După ce termină de scris o piesă, acesta trebuie să o transcrie într-un caiet, într-o formă care poate fi înțeleasă de artiști.

Fiecare pagină din caiet va fi alcătuită din x linii și y coloane, conținând versurile melodiei. Fiecare linie începe cu un cuvânt și se termină cu un cuvânt. Cuvintele de pe aceeași linie vor fi separate prin cel puțin un caracter '*', astfel încât numărul total de caractere de pe linie să fie y. În cazul în care o linie conține un singur cuvânt, el se va afla la începutul liniei.

Steluțele dintre cuvintele de pe o linie sunt distribuite în așa fel încât diferența dintre numărul de caractere '*' dintre 2 cuvinte consecutive și numărul de caractere'*' dintre alte 2 cuvinte consecutive e maxim 1, iar un număr mai mare de steluțe se află la începutul liniei. Astfel, dacă avem 4 cuvinte a, b, c și d și numărul de caractere de pe linie trebuie sa fie 9, înseamnă că e nevoie să punem 5 steluțe și vom așeza 2 steluțe între a și b, 2 steluțe între b și c și 1 steluță între c și d.

2 pagini consecutive vor fi despărțite mereu printr-un rând liber (vezi exemplul).

Mihnea te-a angajat să faci un program care să îl scutescă de munca de transcriere pe caiet, pentru a putea să își investească timpul compunând hit-uri.

Date de intrare
Programul va citi de pe prima linie un număr natural n, reprezentând numărul de cuvinte conținute intr-o melodie compusă de Mihnea. Pe aceeași linie se vor mai găsi două numere naturale x și y, care vor reprezenta numărul de linii și coloane de pe o pagină.

Pe următoarele n linii se vor găsi cele n cuvinte din melodie, formate din litere mici și mari ale alfabetului englez, respectiv semne de punctuație la sfârşitul cuvântului (cate un cuvânt pe linie). Semnele de punctuație vor apărea mereu lipite la finalul cuvântului anterior.

Date de ieșire
Programul va afișa pe ecran textul formatat după criterile prezentate mai sus.

Restricții și precizări
0 < n ≤ 100
1 ≤ x ≤ 20
8 ≤ y ≤ 20
un cuvânt poate fi format din litere mari și mici ale alfabetului englez și nu poate conține litere mari decât pe prima poziție.
cuvintele mai pot conţine şi semnele de punctuaţie , (virgulă), . (punct),! (semnul exclamării),? (semnul întrebării), . . . (puncte de suspensie). Fiecare propoziţie se termină cu unul din semnele de punctuaţie menţionate.
Se garantează că dimensiunea unui rând nu va fi mai mică decât dimensiunea celui mai lung cuvânt dat, urmat de eventualele semne de punctuație.

Exemplu

Date de intrare
9 4 10
Afara
este
foarte
cald.
Nu
mergem
astazi
la
padure!
Date de iesire!

Afara*este
foarte
cald.***Nu
mergem

astazi**la
padure!

Limbaj C++


Levi20: De unde e problema. Daca e de pe pbinfo as vrea să i știu numărul

Răspunsuri la întrebare

Răspuns de Levi20
2

#include<iostream>

#include<cstring>

using namespace std;

char s[21][21];

int main()

{

int x,y,n,l=0,nr=0,ok=0;

cin>>n>>x>>y;

char cuv[21];

for(int i=0;i<n;i++)

{

cin>>cuv;

int d1=strlen(s[l]),d2=strlen(cuv);

if(y==d1)

{

l++;

nr=0;

}

else

if(y-d1<=d2)

{

int ct=y-d1+nr,ct1=ct/nr,ct2=ct%nr;

char *p,lin[21],star[20]="";

strcpy(lin,s[l]);

for(int i=1;i<=ct1;i++)

strcat(star,"*");

strcpy(s[l],"");

p=strtok(lin,"*");

while(p!=NULL)

{

strcat(s[l],p);

if(nr!=0)

{

strcat(s[l],star);

if(ct2!=0)

{

strcat(s[l],"*");

ct2--;

}

nr--;

}

p=strtok(NULL,"*");

}

nr=0;

l++;

}

else

if(d1!=y && d1!=0)

{

strcat(s[l],"*");

nr++;

}

if((l+1)%(x+1)==0)

l++;

strcat(s[l],cuv);

}

if(nr!=0)

{

int d1=strlen(s[l]),d2=strlen(cuv);

int ct=y-d1+nr,ct1=ct/nr,ct2=ct%nr;

char *p,lin[21],star[20]="";

strcpy(lin,s[l]);

for(int i=1;i<=ct1;i++)

strcat(star,"*");

strcpy(s[l],"");

p=strtok(lin,"*");

while(p!=NULL)

{

strcat(s[l],p);

if(nr!=0)

{

strcat(s[l],star);

if(ct2!=0)

{

strcat(s[l],"*");

ct2--;

}

nr--;

}

p=strtok(NULL,"*");

}

}

for(int i=0;i<=l;i++)

cout<<s[i]<<"\n";

return 0;

}

Alte întrebări interesante