Comment générer des permutations avec des caractères répétés

Je veux fondamentalement créer des chaînes composées de trois symboles d’opération (par exemple: +-* ou ++/ ou +++ ). Chacune de ces chaînes doit être vector opPermutations dans le vector opPermutations Ceci est mon code jusqu’à présent:

  // Set up permutations for operators ssortingng operatorBank[4] = {"+","-","*","/"}; do { ssortingng currentPerm = operatorBank[0] + operatorBank[1] + operatorBank[2] + operatorBank[3]; this -> opPermutations.push_back(currentPerm); } while ( std::next_permutation(operatorBank, operatorBank + 4) ); 

Les permutations qui sont poussées dans le vecteur (sous forme de chaînes) sont:

 +-*/ +-/* +/*- +/-* -*+/ -*/+ -+*/ -+/* -/*+ -/+* /*+- /*-+ /+*- /+-* /-*+ /-+* 

Ce que je veux cependant, c’est que mes permutations existent comme ceci:

  • Chacun doit être composé de trois caractères
  • Toutes les permutations possibles, y compris celles dans lesquelles un personnage est répété plus d’une fois, doivent être présentes.

Je veux qu’il soit organisé comme tel:

 +++ --- *** /// /*/ +-+ ++* **/ etc... 

Comment puis-je atteindre cet objective?

Utiliser la récursion pour imprimer ce que vous avez demandé. L’adapter pour stocker la chaîne de permutation dans des vecteurs devrait être sortingvial. Je ne suis pas un programmeur c ++, il peut donc exister un meilleur moyen de le faire en C ++. mais l’idée principale ici est d’utiliser la récursivité.

  #include  #include  #include  #include  #include  using namespace std; void displayPermutation(ssortingng permutation[], int length){ int i; for (i=0;i 

sortie:

  +++ ++- ++* ++/ +-+ +-- +-* +-/ +*+ +*- +** +*/ +/+ +/- +/* +// . . and so on. 

Les chaînes avec des éléments répétés ne sont pas des permutations possibles, car une permutation est un ordre.

Vous pouvez le faire avec 3 boucles nestedes, comme l’a dit Wlyles.

Édité pour append:

Cela va imprimer les chaînes que je pense que vous voulez. Vous pouvez remplacer l’instruction cout par opPermutations.push_back(operatorBank[i]+operatorBank[j]+operatorBank[k]) à append au vecteur.

 #include  #include  int main(){ std::ssortingng operatorBank[4] = {"+","-","*","/"}; for (int i=0; i<4; ++i){ for (int j=0; j<4; ++j){ for (int k=0; k<4; ++k){ std::cout << operatorBank[i] << operatorBank[j] << operatorBank[k] << std::endl; } } } return 0; } 

Je pense que la confusion est peut-être sur le terme "permutation". Vous pouvez obtenir les mêmes chaînes que les 3-permutations de l'ensemble {"+","+","+","-","-","-","*","*","*","/","/","/"} mais utiliser des boucles me semble plus simple.

Le moyen le plus simple de générer des permutations est Set Product.

 list setProduct (list a, list b) { list L; list::iterator i, j; for(i = a.begin(); i != a.end(); ++i) for(j = b.begin(); j != b.end(); ++j) L.push_front(*i + *j); return L; } list permute (list a, int len) { list L; while (len --> 0) L.splice(a.end(), setProduct(L,a)); return L; }