假设有8位参加者的类(class),我必须以所有可能的方式输出前3位。
前任 :
123
124
125
126
127
128
213
很快..
我知道有next_permutation
算法,但它会返回所有数字(从1到8)的所有可能置换,但我需要所有分词的前3个位置
前任:
1 2 3 4 5 6 7 8
1 2 3 4 5 6 8 7
最佳答案
该程序会生成您要寻找的输出,不一定按您期望的顺序输出。如果您希望以特定的顺序进行输出,则可能需要捕获输出并对输出进行排序。要查看它的运行情况,请look here。
#include <algorithm>
#include <iostream>
template <typename Iterator>
inline bool next_combination(Iterator first,
Iterator k,
Iterator last);
int main () {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
do {
do {
std::cout << array[0] << array[1] << array[2] << "\n";
} while(std::next_permutation(array, array+3));
} while(next_combination(array,array+3,array+8));
}
template <typename Iterator>
inline bool next_combination(const Iterator first, Iterator k, const Iterator last)
{
/* Credits: Thomas Draper */
// http://stackoverflow.com/a/5097100/8747
if ((first == last) || (first == k) || (last == k))
return false;
Iterator itr1 = first;
Iterator itr2 = last;
++itr1;
if (last == itr1)
return false;
itr1 = last;
--itr1;
itr1 = k;
--itr2;
while (first != itr1)
{
if (*--itr1 < *itr2)
{
Iterator j = k;
while (!(*itr1 < *j)) ++j;
std::iter_swap(itr1,j);
++itr1;
++j;
itr2 = k;
std::rotate(itr1,j,last);
while (last != j)
{
++j;
++itr2;
}
std::rotate(k,itr2,last);
return true;
}
}
std::rotate(first,k,last);
return false;
}
关于c++ - C++ next_permutation算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9501742/