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

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 vocalele sunt puncte fixe.

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 rămân pe pozițiile inițiale.

Restricții și precizări
cuvântul s are cel mult 11 caractere și este format din litere mici distincte

Exemplu:
Intrare:
dorel
Ieșire:
doler
dorel
loder
lored
rodel
roled

Explicație
Anagramele sunt afișate în ordine lexicografică, iar literele o și e rămân pe pozițiile inițiale.

Răspunsuri la întrebare

Răspuns de Utilizator anonim
0

Răspuns:

#include <iostream>

#include <cstring>

#include <algorithm>

using namespace std;

const int N = 12;

int n;

char s[N];

int sol[N];

bool folosit[N];

char cuv[N];

bool vocala(char c) {

   if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')

       return 1;

   return 0;

}

void afis() {

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

       cout << s[sol[i]];

   cout << '\n';

}

void bkt(int p) {

   if(p == n) {

       afis();

       return;

   }

   if(vocala(s[p])) {

       sol[p] = p;

       bkt(p + 1);

       return;

   }

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

       if(!folosit[i]) {

           sol[p] = i;

           folosit[i] = true;

           bkt(p + 1);

           folosit[i] = false;

       }

   }

}

int main() {

   cin >> s;

   strcpy(cuv, s);

   n = strlen(s);

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

       for(int j = i + 1; j < n; j++)

           if(!vocala(s[i]) && !vocala(s[j]) && s[i] > s[j]) {

               char aux = s[i];

               s[i] = s[j];

               s[j] = aux;

           }

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

       if(vocala(s[i])) {

           folosit[i] = true;

       }

   }

   bkt(0);

   return 0;

}

Explicație:

Alte întrebări interesante