2013-05-21 11 views
6

Sto provando a ottenere un accordo con le schede dei tic tac toe. Quindi ho il seguente codice:come usare next_permutation

// 5 turns for x if x goes first 
std::string moves = "xxxxxoooo"; 

do { 
    std::cout << moves << std::endl; 
} while (std::next_permutation(moves.begin(), moves.end())); 

Ma emette solo una volta la stringa originale. Suppongo che ogni personaggio debba essere unico. Qual è un modo in cui posso farlo?

+4

Provare a partire con l'ordine opposto, 'next_permutation' li produce in ordine lessicografico, e quello che si ha è l'ultimo lessicograficamente. –

risposta

14

std::next_permutation restituisce la successiva permutazione in ordine lessicografico e restituisce false se viene generata la prima permutazione (in tale ordine).

Poiché la stringa con cui si inizia ("xxxxxoooo") è in realtà l'ultima permutazione dei caratteri di quella stringa in ordine lessicografico, il ciclo si interrompe immediatamente.

Pertanto, si può provare l'ordinamento moves prima di iniziare a chiamare next_permutation() in un ciclo:

std::string moves = "xxxxxoooo"; 
sort(begin(moves), end(moves)); 

while (std::next_permutation(begin(moves), end(moves))) 
{ 
    std::cout << moves << std::endl; 
} 

Ecco un live example.