Se dă un text care conține mai multe cuvinte formate din litere mici și mari ale alfabetului englez, separate prin spații. Să se afișeze cuvintele din text, ordonate crescător în funcție de numărul de vocale. În cazul în care două cuvinte au același număr de vocale, se vor afișa în ordine lexicografică.
Date de intrare:
Cuvintele citite vor fi separate prin spații și pot apărea pe mai multe linii.
Date de ieșire:
Pe ecran se vor afișa cuvintele textului ordonate după criteriul din enunț, câte un cuvânt pe o linie.
Restricții:
Șirul va conține maxim 1 000 de caractere
Fiecare cuvânt va conține maxim 20 caractere
Textul va conține maxim 100 de cuvinte
O linie va conține maxim 1 000 de caractere
Exemplu
Date de intrare:
Ana are mere
Cosmin are portocale
Date de iesire:
Ana
Cosmin
are
are
mere
portocale
Răspunsuri la întrebare
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int n,X[12],P[12];
char s[12];
void afisare()
{
for(int i=1;i<=n;i++)
cout<<s[X[i]-1];
cout<<endl;
}
int valid(int k)
{
if(k>1) //daca sunt cel putin la cea de-a doua litera
{
if(strchr("aeiou",s[X[k]-1])==0 &&
strchr("aeiou",s[X[k-1]-1])==0)
return 0; //doua consoane alaturare => 0
if(strchr("aeiou",s[X[k]-1])!=0 &&
strchr("aeiou",s[X[k-1]-1])!=0)
return 0; //doua vocale alaturate => 0
}
return 1;
}
void back(int k)
{
for(int i=1;i<=n;i++)
if(!P[i])
{
P[i]=1;
X[k]=i;
if(valid(k))
if(k==n) afisare();
else back(k+1);
P[i]=0;
}
}
void ordonare(char s[])
{
int l=strlen(s);
for(int i=0;i<l;i++)
for(int j=i+1;j<l;j++)
if(s[i]>s[j])
{
char aux=s[i];
s[i]=s[j];
s[j]=aux;
}
}
int main()
{
cin>>s;
n=strlen(s);
int cv=0,cc=0;
for(int i=0;i<n;i++)
if(strchr("aeiou",s[i])==0) cc++;//numaram consoanele
else cv++;//numaram vocalele
if(abs(cc-cv)>1) cout<<"IMPOSIBIL";//diferenta>1 => imposibil
else
{
ordonare(s);//ordonez alfabetic cuvantul
back(1);
}
return 0;
}