我想要獲取矢量的每個排列,但也要用指示子排列的分隔符。看起來我的代碼中存在一個錯誤,因爲從我的結果中可以看到結尾的排列。排列矢量
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」參數? – PaulMcKenzie
我對創建的排列更感興趣,以便在最優TSP問題上執行分支和限制算法。向量的int表示圖中頂點的索引。分割器將解決方案中的頂點(左側)與需要進行成本估算的頂點之間的分隔結合起來。這個想法是我可以跳過一個排列,如果min-cost> lowerbound – ParoX
你確定問題不是你通過值'而不是'通過引用'傳遞矢量嗎?通過價值傳遞矢量對我來說看起來很可疑。只要permute()返回,next_permutation()所做的所有更改都會丟失。 – PaulMcKenzie