2013-11-26 40 views
1

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

例如:只使用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' 。这可能吗?有人可以引导我朝着正确的方向完成这个任务吗?

+2

你可以证明你到目前为止所尝试过的吗? –

+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 
}