# PBinfo #3915 – anagrame_cv – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

Cerința
Se citește de la tastatură un cuvânt s format din cel mult 11 litere mici distincte. Să se genereze în ordine alfabetică și să se afișeze toate anagramele cuvântului s în care nu există două vocale alăturate și nici două consoane alăturate.

Date de intrare
Programul citește de la tastatură cuvântul s.

Date de ieșire
Programul va afișa pe ecran pe rânduri separate anagramele cuvântului citit în care vocalele și consoanele alternează (nu există două vocale alăturate și nici două consoane alăturate).

Restricții și precizări

cuvântul s are cel mult 11 caractere și este format din litere mici distincte
dacă nu există soluții, atunci se va afișa mesajul IMPOSIBIL.

Exemplu:
Intrare

cosmina
Ieșire

caminos
camison
camonis
camosin
canimos
canisom
canomis
canosim
casimon
casinom
casomin
casonim
cimanos
cimason
cimonas
cimosan
cinamos
cinasom
cinomas
cinosam
...
sonimac
(în total 144 de anagrame)
Exemplu:
Intrare

cosmin
Ieșire

IMPOSIBIL

## Cod sursă C++

```cpp
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int n,X[13],P[13];
char s[13];
void afisare()
{
    for(int i=1;i<=n;i++)
        cout<<s[X[i]-1];
    cout<<"\n";
}
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;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3915)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3915/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3915/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
