在C ++中跳过排列元素

时间:2013-11-26 07:07:29

标签: c++

这是我的问题。我想从20个元素数组生成完整的排列。但是在排列过程中,我希望能够使用条件来测试每个生成的排列的各种属性,并根据测试结果,中断或跳过整个块,然后继续生成排列。

例如:仅使用a,b,c,d作为数组的元素,完整的排列集将产生:

abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba

但是让我们说在执行置换循环之后进行测试后,决定以“b”开头的任何新置换都是无效的,所以我想跳过所有这些并继续以'c'开头的排列。我想这跳跃是能够在设定范围内任何地方的任何信件进行,让我们说,对在“CABD”这是决定跳过与“CA”开头的所有未来的排列,并立即转移到“cbad”到达。这可能吗?有人能引导我朝着正确的方向去实现这个目标吗?

1 个答案:

答案 0 :(得分:2)

您可以在std::next_permutation上编写一个包装器方法,在内部调用它直到满足某些条件然后返回。

template <class BidirectionalIterator>
void my_next_permutation (BidirectionalIterator first,
                     BidirectionalIterator last);
{
    do
    {
        next_permutation(first, last);
    } while ( !MyCondition(first, last) );
    //MyCondition can also be passed by parameter
}