2010-01-26 7 views
5

Ho una lista di N elementi e mi chiedo come posso scorrere l'elenco per ottenere ogni combinazione. Non ci sono i doppi, quindi ho bisogno di prendere tutto N! ordinamenti. La memoria extra non è un problema, sto cercando di pensare all'algoritmo più semplice ma ho dei problemi.Algoritmo C++ per N! ordini

+0

è una combinazione o una permutazione? – sud03r

+0

Vedere anche una spiegazione di due diversi algoritmi su http://stackoverflow.com/questions/352203/generating-permutations-lazily/ – ShreevatsaR

risposta

15
+1

Buona chiamata (per così dire). Sebbene sia giusto, l'OP ha chiesto l'algoritmo * più semplice *. –

8

Ampliando le risposte degli altri, ecco un esempio di std :: next_permutation adattato da cplusplus.com

#include <iostream> 
#include <algorithm> 
using namespace std; 

void outputArray(int* array, int size) 
{ 
    for (int i = 0; i < size; ++i) { cout << array[i] << " "; } 
} 

int main() 
{ 
    int myints[] = { 1, 2, 3, 4, 5 }; 
    const int size = sizeof(myints); 

    cout << "The 5! possible permutations with 5 elements:\n"; 

    sort (myints, myints + size); 

    bool hasMorePermutations = true; 
    do 
    { 
    outputArray(myints, size); 
    hasMorePermutations = next_permutation(myints, myints + size); 
    } 
    while (hasMorePermutations); 

    return 0; 
} 
+0

+1 per fornire un esempio. –

+0

Non sembra esserci alcun punto nella variabile 'bool'. Puoi semplicemente 'do {...} while (std :: next_permutation (...));' –

+1

@Charles: È vero, potrei farlo. Per motivi di insegnamento ho estratto la next_permutation poiché quello era il focus del codice. – Bill

0

semplice algoritmo utilizzando la ricorsione:

pseudocodice

getPermutations(CurItemList , CurPermList) 

if CurItemList.isempty() 
    return CurPermList 
else 
    Permutations = {} 

    for i = 1 to CurItemList.size() 
     CurPermList.addLast(CurItemList.get(i)) 

     NextItemList = CurItemList.copy() 
     NextItemList.remove(i) 

     Permutations.add(getPermutations(NextItemList, CurPermList)) 

     CurPermList.removeLast() 


return Permutations 

// To make it look better 
Permutations(ItemList) 
    return getPermutations(ItemList, {}) 

I non l'ho provato, ma dovrebbe funzionare Forse non è il modo più intelligente per farlo, ma è un modo semplice. Se qualcosa non va, per favore fatemelo sapere!

0

Provare a creare il set di combinazioni in modo ricorsivo con un numero fisso di elementi possibili. L'insieme di tutte le combinazioni possibili sarà l'unione delle serie di combinazioni di 1 elemento, 2 elementi, ... fino a N elementi.

Quindi è possibile attaccare ogni combinazione di dimensioni fisse singolarmente.