怎样遍历限制了部分顺序的全排列( 二 )
当然这里已经不仅仅是个数相等了,所要求的全排列其实就是对应有向无环图的全部拓扑序。
回到原题,如何产生这样的全排列?
既然已经同一些经典问题关联起来了,还是直接google吧:
对于情况1:
How to generate all the permutations of a multiset?
情况2:
How to get all the solutions of topological sorting
■网友
随手写的,没有检查,自己保证输入,用法,在 require 第三个参数里写上要求的顺序:#include \u0026lt;iostream\u0026gt;#include \u0026lt;algorithm\u0026gt;#include \u0026lt;vector\u0026gt;template \u0026lt;class Iter, class T\u0026gt;bool require(Iter first, Iter last, std::initializer_list\u0026lt;T\u0026gt; list){ if (list.size() \u0026lt; 2) { return true; } Iter f = std::find(first, last, *list.begin()); for (auto i = list.begin() + 1; i != list.end(); ++i) { Iter s = std::find(first, last, *i); if (s \u0026lt; f) return false; f = s; } return true;}int main(){ std::vector\u0026lt;int\u0026gt; v{ 1,2,3,4,5 }; do { if (require(v.begin(), v.end(), { 1,2,3 })) { std::for_each(v.begin(), v.end(), (int v) {std::cout \u0026lt;\u0026lt; " " \u0026lt;\u0026lt; v; }); std::cout \u0026lt;\u0026lt; "\"; } } while (std::next_permutation(v.begin(), v.end()));}输出: 1 2 3 4 5 1 2 3 5 4 1 2 4 3 5 1 2 4 5 3 1 2 5 3 4 1 2 5 4 3 1 4 2 3 5 1 4 2 5 3 1 4 5 2 3 1 5 2 3 4 1 5 2 4 3 1 5 4 2 3 4 1 2 3 5 4 1 2 5 3 4 1 5 2 3 4 5 1 2 3 5 1 2 3 4 5 1 2 4 3 5 1 4 2 3 5 4 1 2 3.
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?
- 怎样评价华为、诺基亚、中兴中标中国移动高端路由交换设备扩容集采
- 怎样评价类似前橙会、百老汇、南极圈这样类型的离职帮抱团,对企业的积极意义和消极意义
