如何使用std :: next_permutation处理重新出现的值

时间:2018-01-03 19:56:14

标签: c++ permutation

我有一些载体。 我想找到每个向量的所有排列。 它的工作原理相当不错,当值是唯一的但是如果有重新出现的值则它会混乱。

我有以下载体

vector<string> present = {"Schaukelpferd","Schaukelpferd","Puppe","Puppe"};
vector<string> children = {"Jan","Tim","Alex","Daniel"};
vector<int> houses = {4,5,5,5};

我在使用next_permutation()

之前对其进行排序
sort(present.begin(),present.end());
sort(children.begin(),children.end());
sort(houses.begin(),houses.end());
do {
    present_perm.push_back(present);
} while (next_permutation(present.begin(), present.end()));
do {
    children_perm.push_back(children);
} while (next_permutation(children.begin(), children.end()));
do {
    houses_perm.push_back(houses);
} while (next_permutation(houses.begin(), houses.end()));

children效果很好,但是现场以及房屋不能按预期工作

子项返回24排列,正如预期的那样,仅返回6,而房屋只返回4。我希望所有人都返回24,因为所有向量都有4个元素(4! = 24)。

1 个答案:

答案 0 :(得分:0)

考虑四个整数值4,5,5,5。四种可能的排列是4,5,5,5和5,4,5,5和5,5,4,5和5,5,5 ,4。就是这样。三个5具有相同的值,因此它们不能彼此区分。该算法不会跟踪哪些值最初出现在另一个之前;他们是一样的。同样适用于present:有三个不同的值,而不是四个。