C++ 查找大小为n的所有可能数组,这些数组由另一个数组中所有可能的元素组合以所有可能的顺序构造而成?
对于任意长度n的数组A,我想用A中的所有元素组合填充nxm数组B,其中包括这些元素的所有可能顺序。例如,如果A={1,2,3}和m=2,我想将B作为: 十一, 十二, 十三, 二十一, 二十二 二十三 三十一 三十二 三十三 在C/C++中实现这一点的有效方法是什么?谢谢 编辑:以下是我的工作原理(数据在类combs中,它基本上是一个矩阵类,有一些附加技巧):C++ 查找大小为n的所有可能数组,这些数组由另一个数组中所有可能的元素组合以所有可能的顺序构造而成?,c++,c,combinatorics,C++,C,Combinatorics,对于任意长度n的数组A,我想用A中的所有元素组合填充nxm数组B,其中包括这些元素的所有可能顺序。例如,如果A={1,2,3}和m=2,我想将B作为: 十一, 十二, 十三, 二十一, 二十二 二十三 三十一 三十二 三十三 在C/C++中实现这一点的有效方法是什么?谢谢 编辑:以下是我的工作原理(数据在类combs中,它基本上是一个矩阵类,有一些附加技巧): void combs::setCombs(int-arr[],int-n,int-m){ intz,tmp,重复; int max=(i
void combs::setCombs(int-arr[],int-n,int-m){
intz,tmp,重复;
int max=(int(功率(双(n),双(m)));
for(int i=0;i 正如@Joachim Pileborg所提到的,你的问题在参数方面缺少很多东西。
但是假设你可以保证你给我传递了一个排序唯一整数的向量。那么这种蛮力是可能的:
std::vector< std::string > Combo( const std::vector< char >& source, int m )
{
std::vector< std::vector< char >::const_iterator > digits( length, source.cbegin() );
std::vector< std::string > result( source.size() * m );
for( int i = 0; i < result.size(); i++ )
{
for( int j = 0; j < m; j++ )
{
result[i] += *(digits[j]);
}
for( int j = digits.size() - 1; j >= 0; j-- )
{
++digits[j];
if( digits[j] == source.cend() )
{
digits[j] = source.cbegin();
}
else
{
break;
}
}
}
return result;
}
std::vector组合(const std::vector&source,int m)
{
std::vector::常量迭代器>数字(长度,source.cbegin());
std::vectorresult(source.size()*m);
对于(int i=0;i=0;j--)
{
++数字[j];
如果(数字[j]==source.cend())
{
数字[j]=source.cbegin();
}
其他的
{
打破
}
}
}
返回结果;
}
您描述的内容听起来像是部分排列,而不是组合
如果使用C++,那么建议使用向量,因为向量可以告诉它们的大小,并且释放它们自己的内存。
vector<vector<int> > partialPermutations(vector<int> &A,int m){
int i,i2,t,n=A.size(),total=1;
for(i=0;i<m;i++) total*=n;
vector<vector<int> > result;
for(i=0;i<total;i++){
result.push_back(vector<int>());
t=i;
for(i2=0;i2<m;i2++){
result[i].push_back(A[t%n]);
t/=n;
}
}
return result;
}
int main() {
vector<int> A;
int total,i,i2;
for(i=1;i<=4;i++) A.push_back(i);
vector<vector<int> > re=partialPermutations(A,2);
for(i=0;i<re.size();i++){
for(i2=0;i2<2;i2++)
cout<<re[i][i2]<<" ";
cout<<endl;
}
return 0;
}
int** partialPermutations(int*A,int n,int m,int &total){
int i,i2,t;
total=1;
for(i=0;i<m;i++) total*=n;
int **result=new int*[total];
for(i=0;i<total;i++){
t=i;
result[i]=new int[m];
for(i2=0;i2<m;i2++){
result[i][i2]=A[t%n];
t/=n;
}
}
return result;
}
int main() {
int A[]={1,2,3,4};
int total,i,i2;
int **re=partialPermutations(A,4,2,total);
for(i=0;i<total;i++){
for(i2=0;i2<2;i2++)
cout<<re[i][i2]<<" ";
cout<<endl;
}
//Cleanup
for(i=0;i<total;i++) delete[] re[i];
delete[] re;
return 0;
}
vector partialPermutations(vector&A,int-m){
inti,i2,t,n=A.size(),总计=1;
(i=0;I.你尝试了什么?什么工作?什么问题?你遇到了什么问题?你读过用G++编译的@右折叠吗?所以C++。这是我原来做的,但它不是我真正想要的。它会打印123个,但不是321个。它适用于所有的M’(小于等于或大于n)。
vector<vector<int> > partialPermutations(vector<int> &A,int m){
int i,i2,t,n=A.size(),total=1;
for(i=0;i<m;i++) total*=n;
vector<vector<int> > result;
for(i=0;i<total;i++){
result.push_back(vector<int>());
t=i;
for(i2=0;i2<m;i2++){
result[i].push_back(A[t%n]);
t/=n;
}
}
return result;
}
int main() {
vector<int> A;
int total,i,i2;
for(i=1;i<=4;i++) A.push_back(i);
vector<vector<int> > re=partialPermutations(A,2);
for(i=0;i<re.size();i++){
for(i2=0;i2<2;i2++)
cout<<re[i][i2]<<" ";
cout<<endl;
}
return 0;
}
int** partialPermutations(int*A,int n,int m,int &total){
int i,i2,t;
total=1;
for(i=0;i<m;i++) total*=n;
int **result=new int*[total];
for(i=0;i<total;i++){
t=i;
result[i]=new int[m];
for(i2=0;i2<m;i2++){
result[i][i2]=A[t%n];
t/=n;
}
}
return result;
}
int main() {
int A[]={1,2,3,4};
int total,i,i2;
int **re=partialPermutations(A,4,2,total);
for(i=0;i<total;i++){
for(i2=0;i2<2;i2++)
cout<<re[i][i2]<<" ";
cout<<endl;
}
//Cleanup
for(i=0;i<total;i++) delete[] re[i];
delete[] re;
return 0;
}