查找大小为 n 的所有可能的数组,这些数组由另一个数组中所有可能的元素组合以所有可能的顺序构建
Find all possible arrays of size n constructed with all possible combinations of elements from another array in all possible orders?
对于任意长度为 n 的数组 A,我想用 A 中的所有元素组合填充 n x m 数组 B,其中包括这些元素的所有可能顺序。例如,如果 A = {1, 2, 3} 且 m = 2,我想得到 B 作为:
11
12
13
21
22
23
31
32
33
在 C/C++ 中执行此操作的有效方法是什么?谢谢!
编辑:这是我发现的工作(数据在类梳子中,它基本上是一个矩阵类,有一些添加的技巧):
void combs::setCombs (int arr[], int n, int m) {
int z, tmp, repeat;
int max = (int (pow(double (n), double( m ))));
for (int i = 0; i < m; i++) {
z = 0;
repeat = int (pow( double (n), double (i)));
for (int j = 0; j < repeat; j++) {
for (int k = 0; k < n; k ++) {
for (int p = 0; p < max/(n*repeat); p ++) {
cout << arr[k] << endl;
data[z*ROWS + i] = arr[k];
z++;
}
}
}
}
}
正如 @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;
}
你所描述的听起来像是部分排列,而不是组合。
如果您使用的是 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;
}
请注意,通过使用数组,我们必须恢复结果数组的大小(通过引用传递total
),之后我们必须释放内存。这些对于向量来说都不是必需的。
#include<iostream>
using namespace std;
void printStrRec(string s,string ans,int k,int i)
{
if(i==k)
{
cout<<"nAnswer : "<<ans<<endl;
}
else
{
for(int x=0;x<s.size();++x)
{
ans[i]=s[x];
printStrRec(s,ans,k,i+1);
}
}
}
void printStrings(string s,int k)
{
string ans;
for(int p=0;p<k;++p)
{
ans+="x";
}
printStrRec(s,ans,k,0);
}
int main()
{
int k;
string s;
cout<<"Enter the set : ";
cin>>s;
cout<<"nEnter k : ";
cin>>k;
printStrings(s,k);
return 0;
}
希望有帮助。
相关文章:
- 2D数组来自文本输入,中间有空格
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- C++,数组有多少个地址?
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 在给定程序中降低矢量数组实现堆栈的时间复杂度有哪些不同的可能方法?
- 我们在 c++17 中有自动数组吗?
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 可能的数组数,使得相邻元素最多有 1 个差异
- 如何递归枚举每个元素都有上限的所有可能的数组
- 有可能实现一个与数组而不是单个对象一起工作的内存池吗
- 在C++中使用有界数组的正确方法是什么?
- 生成所有可能数组的算法
- 在c++中,一个类是否可能有一个包含另一个类的对象的数组?
- C/ c++中有复制数组的函数吗?
- 在C++中如何可能有一个字符串数组
- 是否有可能以NULL终止c++结构体的二维数组?
- 是否有可能从未排序的数组中高效地创建平衡二叉搜索树而不对数组进行排序?
- 有没有可能在没有for循环的情况下将本机结构数组封送到托管数组?