【发布时间】:2014-04-17 17:35:59
【问题描述】:
我正在尝试获取向量的每个排列,但也尝试使用指示子排列的分隔符。从我的结果中您可以看到结束排列,我的代码似乎有错误。
0 1 3 2 | 和 0 2 3 1 | 和 0 3 2 1 | 都是重复的。
我也很好奇是否有一种方法可以做我想做的事情,可以接受对向量的引用而不是复制。
IDEONE:http://ideone.com/fork/2v0wk3
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void permute(vector<int> v, int path_length) {
do {
for(int i=0; i<=3; ++i) {
cout << v[i] << " ";
if(i == path_length-1)
cout << "| ";
}
cout << endl;
if(path_length == v.size()) {
cout << "====="<< endl;
return;
}
permute(v, path_length+1);
} while(next_permutation(v.begin()+path_length-1,v.end()));
}
int main() {
vector<int> v;
for(int i=0;i<=3;++i)
v.push_back(i);
int path_length = 2;
permute(v, path_length);
return 0;
}
结果:
0 1 | 2 3
0 1 2 | 3
0 1 2 3 |
=====
0 1 3 | 2
0 1 3 2 |
=====
0 1 | 3 2
0 1 3 | 2
0 1 3 2 |
=====
0 2 | 1 3
0 2 1 | 3
0 2 1 3 |
=====
0 2 3 | 1
0 2 3 1 |
=====
0 2 | 3 1
0 2 3 | 1
0 2 3 1 |
=====
0 3 | 1 2
0 3 1 | 2
0 3 1 2 |
=====
0 3 2 | 1
0 3 2 1 |
=====
0 3 | 2 1
0 3 2 | 1
0 3 2 1 |
=====
预期结果:
0 1 | 2 3
0 1 2 | 3
0 1 2 3 |
=====
0 1 3 | 2
0 1 3 2 |
=====
0 2 | 1 3
0 2 1 | 3
0 2 1 3 |
=====
0 2 3 | 1
0 2 3 1 |
=====
0 3 | 1 2
0 3 1 | 2
0 3 1 2 |
=====
0 3 2 | 1
0 3 2 1 |
=====
【问题讨论】:
-
所以基本上,你希望看到在你的 main() 函数中声明的向量“v”在 permute() 被调用后改变了值?或者更重要的是,您是否期望在递归调用 permute() 之后更改“v”参数?
-
我更感兴趣的是为了对最优 TSP 问题进行分支定界算法而创建的排列。向量的 int 表示图中顶点的索引。分隔符演示解决方案中的顶点(左)和需要进行成本估算的顶点之间的划分。我的想法是如果 min-cost > lowerbound 我可以跳过排列
-
您确定问题不在于您传递向量
by value而不是by reference?按值传递向量对我来说看起来很可疑。一旦 permute() 返回,所有 next_permutation() 所做的更改都会丢失。 -
这是解决方案/问题的一部分,只是通过引用导致无限循环,所以这就是我遇到的问题。我希望它在第一次调用中通过引用传递,以便
0 1 | 2 3在0 1 3 2 |之后从0 2 | 1 3开始,但在其他调用中我不希望通过引用传递它
标签: c++ algorithm vector permutation