这是我的问题。我想从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” 。这可能吗?有人可以引导我朝正确的方向去实现吗?

最佳答案

您可以在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
}

关于c++ - 跳过C++中的置换元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20210582/

10-13 08:10