假设有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/

10-09 23:01