置换算法 C++
Permutation algorithm C++
我尝试翻译一个算法,该算法在 C++ 中生成 n 中 k 的所有排列:
public void calculerEquipeTOT(ArrayList<Nageur> L, ArrayList<Nageur> F, int k) {
if (k == 0) {
if (calculerPointsTOT(L) > this.pointsMeilleureEquipe){
this.meilleureEquipe = L;
this.pointsMeilleureEquipe = calculerPointsTOT(meilleureEquipe);
}
} else {
for (Nageur x : F) {
ArrayList<Nageur> G = new ArrayList<Nageur>(F);
G.remove(G.indexOf(x));
ArrayList<Nageur> L2 = new ArrayList<Nageur>(L);
L2.add(x);
calculerEquipeTOT(L2, G, k - 1);
}
}
}
我的问题是列表可能是对象列表,我不知道如何删除 L2 列表的 x...我不是 C++ 专家,我在 Java 中管理它但是我必须用 C++ 来做。
我已经音译了你的函数,得到了以下内容
#include <iostream>
#include <list>
#include <iterator>
void arrangements( std::list<char> l, std::list<char> f, size_t k )
{
if ( k == 0 )
{
for ( char c : l ) std::cout << c << ' ';
std::cout << std::endl;
}
else
{
for ( auto it = f.begin(); it != f.end(); ++it )
{
std::list<char> g( f.begin(), it );
g.insert( g.end(), std::next( it ), f.end() );
std::list<char> l2( l );
l2.push_back( *it );
arrangements( l2, g , k-1 );
}
}
}
int main()
{
std::list<char> f = { 'A', 'B', 'C', 'D' };
arrangements( std::list<char>(), f, 2 );
}
程序输出为
A B
A C
A D
B A
B C
B D
C A
C B
C D
D A
D B
D C
不知道是不是你想要的
如果调用 k 等于 3 的函数,则程序输出将是
A B C
A B D
A C B
A C D
A D B
A D C
B A C
B A D
B C A
B C D
B D A
B D C
C A B
C A D
C B A
C B D
C D A
C D B
D A B
D A C
D B A
D B C
D C A
D C B
我找到了一种使用标准库中的 next_permutation() 以及本文中的另一个 next_combination() 来做我想做的事情的方法:http://www.codeguru.com/cpp/cpp/algorithms/combinations/article.php/c5117/Combinations-in-C.htm
我的解决方案:
int main(int argc, const char * argv[]) {
cout << "Hello, World!\n";
int nb = 0;
int tab1[] = {0,1,2,3};
vector<int> n (tab1, tab1+sizeof tab1 / sizeof tab1[0]);
int tab2[] = {0,1};
vector<int> r (tab2, tab2+sizeof tab2 / sizeof tab2[0]);
sort (n.begin(), n.end());
do
{
sort(r.begin(),r.end());
//do your processing on the new combination here
vector<int> r2 = r;
do
{
//do your processing on the new permutation here
nb++;
display_vector(r2);
cout << endl;
}
while(next_permutation(r2.begin(),r2.end()));
}
while(next_combination(n.begin(),n.end(),r.begin(),r.end() ));
cout << "Number of possibilities = " << nb << endl;
return 0;
}
显示:
Hello, World!
0 1
1 0
0 2
2 0
0 3
3 0
1 2
2 1
1 3
3 1
2 3
3 2
Number of possibilities = 12
在我的计算机上从 12 个排列中找出所有 10 个排列不到 1 秒...我不知道这是否是一个好的算法,但它比我以前在 Java 中的算法快。
如果有人看到如何改进和优化它,我很感兴趣! :)
我尝试翻译一个算法,该算法在 C++ 中生成 n 中 k 的所有排列:
public void calculerEquipeTOT(ArrayList<Nageur> L, ArrayList<Nageur> F, int k) {
if (k == 0) {
if (calculerPointsTOT(L) > this.pointsMeilleureEquipe){
this.meilleureEquipe = L;
this.pointsMeilleureEquipe = calculerPointsTOT(meilleureEquipe);
}
} else {
for (Nageur x : F) {
ArrayList<Nageur> G = new ArrayList<Nageur>(F);
G.remove(G.indexOf(x));
ArrayList<Nageur> L2 = new ArrayList<Nageur>(L);
L2.add(x);
calculerEquipeTOT(L2, G, k - 1);
}
}
}
我的问题是列表可能是对象列表,我不知道如何删除 L2 列表的 x...我不是 C++ 专家,我在 Java 中管理它但是我必须用 C++ 来做。
我已经音译了你的函数,得到了以下内容
#include <iostream>
#include <list>
#include <iterator>
void arrangements( std::list<char> l, std::list<char> f, size_t k )
{
if ( k == 0 )
{
for ( char c : l ) std::cout << c << ' ';
std::cout << std::endl;
}
else
{
for ( auto it = f.begin(); it != f.end(); ++it )
{
std::list<char> g( f.begin(), it );
g.insert( g.end(), std::next( it ), f.end() );
std::list<char> l2( l );
l2.push_back( *it );
arrangements( l2, g , k-1 );
}
}
}
int main()
{
std::list<char> f = { 'A', 'B', 'C', 'D' };
arrangements( std::list<char>(), f, 2 );
}
程序输出为
A B
A C
A D
B A
B C
B D
C A
C B
C D
D A
D B
D C
不知道是不是你想要的
如果调用 k 等于 3 的函数,则程序输出将是
A B C
A B D
A C B
A C D
A D B
A D C
B A C
B A D
B C A
B C D
B D A
B D C
C A B
C A D
C B A
C B D
C D A
C D B
D A B
D A C
D B A
D B C
D C A
D C B
我找到了一种使用标准库中的 next_permutation() 以及本文中的另一个 next_combination() 来做我想做的事情的方法:http://www.codeguru.com/cpp/cpp/algorithms/combinations/article.php/c5117/Combinations-in-C.htm
我的解决方案:
int main(int argc, const char * argv[]) {
cout << "Hello, World!\n";
int nb = 0;
int tab1[] = {0,1,2,3};
vector<int> n (tab1, tab1+sizeof tab1 / sizeof tab1[0]);
int tab2[] = {0,1};
vector<int> r (tab2, tab2+sizeof tab2 / sizeof tab2[0]);
sort (n.begin(), n.end());
do
{
sort(r.begin(),r.end());
//do your processing on the new combination here
vector<int> r2 = r;
do
{
//do your processing on the new permutation here
nb++;
display_vector(r2);
cout << endl;
}
while(next_permutation(r2.begin(),r2.end()));
}
while(next_combination(n.begin(),n.end(),r.begin(),r.end() ));
cout << "Number of possibilities = " << nb << endl;
return 0;
}
显示:
Hello, World!
0 1
1 0
0 2
2 0
0 3
3 0
1 2
2 1
1 3
3 1
2 3
3 2
Number of possibilities = 12
在我的计算机上从 12 个排列中找出所有 10 个排列不到 1 秒...我不知道这是否是一个好的算法,但它比我以前在 Java 中的算法快。
如果有人看到如何改进和优化它,我很感兴趣! :)