2013-05-21 2 views
6

Я пытаюсь получить аранжировку tic tac toe досок. Поэтому у меня есть следующий код:Как использовать 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())); 

Но он выводит только исходную строку один раз. Я предполагаю, что каждый персонаж должен быть уникальным. Как я могу это сделать?

+4

Попробуйте начать с противоположного порядка, 'next_permutation' производит их в лексикографическом порядке, а то, что у вас есть, является лексикографически последним. –

ответ

14

std::next_permutation возвращает следующую перестановку в лексикографическом порядке и возвращает false, если сгенерирована первая перестановка (в указанном порядке).

Поскольку строка, которую вы начинаете с ("xxxxxoooo"), на самом деле является последней перестановкой символов этой строки в лексикографическом порядке, ваш цикл немедленно останавливается.

Таким образом, вы можете попробовать сортировку moves, прежде чем начать называть next_permutation() в цикле:

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

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

Вот live example.

Смежные вопросы