2017-02-20 3 views
-2

J'essaie de générer une liste de sous-ensembles à partir d'un ensemble. Par exemple, si je devais n = 6, et r = 4, j'aurais 15 combinaisons possibles qui seraient les suivantes: si n = 6 & rJ'essaie de générer une liste de tous les sous-ensembles r, de l'ensemble, n. Mon code fonctionne si n-r = 2, mais si> 2, affiche une sortie incorrecte

0 1 2 3 
0 1 2 4 
0 1 2 5 
0 1 3 4 
0 1 3 5 
0 1 4 5 
0 2 3 4 
0 2 3 5 
0 2 4 5 
0 3 4 5 
1 2 3 4 
1 2 3 5 
1 2 4 5 
1 3 4 5 
2 3 4 5 

Mon code actuel ne fonctionne avec les sous-ensembles ci-dessus = 4. Il fonctionne également si n'importe quelle autre combinaison de nr = 2. Cela ne marche pas pour autre chose et j'ai un peu de mal à déboguer puisque mon code est parfaitement logique pour moi. Le code que j'ai est le suivant:

int array[r]; 
int difference = n-r; 

for(int i = 0; i < r; i++){ 
    array[i] = i; 
} 

while (array[0] < difference){ 
     print (array, r); 
     for(int i = r-1; i >= 0; i--){ 
      if ((array[i] - i) == 0){ 
       array[i] = array[i] + 1; 
       for (int j = i+1; j < r; j++){ 
        array[j] = j + 1; 
       } 
       i = r; 
      } 
      else{ 
       array[i] = array[i] + 1; 
      } 
      print (array, r); 
     } 
    } 
} 

Pour donner un peu de contexte, lorsque je branche n = 6 et r = 3, je suis censé avoir 20 combinaisons comme la sortie. Seuls 14 sont imprimés, cependant:

0 1 2 
0 1 3 
0 1 4 
0 2 3 
0 2 4 
0 3 4 
1 2 3 
1 2 4 
1 3 4 
2 3 4 
2 3 4 
2 3 5 
2 4 5 
3 4 5 

Il se imprime la première et la dernière sortie correctement, mais je dois avoir toutes les sorties imprimées et correctes. Je peux voir après la 3ème itération, le code commence à échouer car il va de 0 1 4 à 0 2 3 quand il devrait aller à 0 1 5 à la place. Des suggestions sur ce que je fais mal?

+1

Probablement un bug. Fournir un [mcve] qui inclut ce que vous entendez par «ne fonctionne pas» peut accélérer votre obtention d'une réponse. – user4581301

+0

Avez-vous essayé de déboguer votre code, surtout lorsque vous passez de la 3ème à la 4ème itération pour voir ce qui fonctionne différemment de vos attentes? – yasd

+0

J'ai, oui. Je comprends qu'il y a un modèle avec la valeur stockée dans le tableau avec le numéro d'emplacement. Donc, pour l'exemple ci-dessus, si vous soustrayez la valeur du tableau avec le numéro d'emplacement, le modèle ressemblera à: (0, 1, 2, 0, 1, 2, 1, 2, 2, 0, 1, 2, 1, 2, 2, 1, 2, 2, 2) J'ai remarqué avec tous les 2, c'est quand le code échoue. J'ai d'abord écrit le code quand le motif était (0, 1, 0, 1, 1, 0, 1, 1, 1 ... etc.), Ce qui explique pourquoi si n-r = 2 fonctionne. Cependant, je pense que puisque j'ai la déclaration d'autre, il prendrait soin de tout le reste, y compris les 2 dans le modèle, mais apparemment pas. – Amanda

Répondre

1

Voici ce que je pense que vous essayez de faire. Autant que je sache, votre problème principal est que la boucle principale for devrait recommencer après l'incrémentation d'un élément de tableau à une valeur valide, plutôt que de continuer.

Cette version appelle uniquement print en un seul endroit et utilise break pour sortir de la boucle principale for. Il compte également les combinaisons trouvées.

#include <iostream> 

void print(int array[], int r) { 
    for(int i=0; i<r; ++i) { 
     std::cout << array[i] << ' '; 
    } 
    std::cout << '\n'; 
} 

int main() { 
    static const int n = 6; 
    static const int r = 3; 

    static const int difference = n-r; 
    int array[r]; 
    for(int i = 0; i < r; i++) { 
     array[i] = i; 
    } 
    int count = 0; 
    while(array[0] <= difference) { 
     ++count; 
     print(array, r); 
     for(int i=r-1; i>=0; --i) { 
      ++array[i]; 
      if(array[i] <= difference + i) { 
       for(int j=i+1; j<r; ++j) { 
        array[j] = array[j-1] + 1; 
       } 
       break; 
    } } } 
    std::cout << "count: " << count << '\n'; 
} 

Sorties

0 1 2 
0 1 3 
0 1 4 
0 1 5 
0 2 3 
0 2 4 
0 2 5 
0 3 4 
0 3 5 
0 4 5 
1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 
count: 20