这是我的问题。我想从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”到达。这可能吗?有人能引导我朝着正确的方向去实现这个目标吗?
答案 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
}