C++ 生成给定数组中所有元素对集的有效方法
假设我得到了数组C++ 生成给定数组中所有元素对集的有效方法,c++,backtracking,C++,Backtracking,假设我得到了数组{1,2,3,4},其中n(数组的大小)介于2和18之间。我需要找到所有把这些元素成对排列的方法。对于这个例子,我得到: (1,2)、(3,4) (1,3)、(2,4) (1,4)、(2,3) 因此,这里的顺序有点重要,因为我不想/不需要生成所有配对相同的排列(我想?)。((1,2)、(3,4)和(3,4)、(1,2)) 我尝试过一种递归回溯方法,这种方法很有效,但对于较大的阵列(14-18)来说,它在时间上并不是很有效,对于所有可能的输入,我需要小于2秒的执行时间 这是我的密码
{1,2,3,4}
,其中n(数组的大小)介于2和18之间。我需要找到所有把这些元素成对排列的方法。对于这个例子,我得到:
(1,2)、(3,4)
(1,3)、(2,4)
(1,4)、(2,3)
因此,这里的顺序有点重要,因为我不想/不需要生成所有配对相同的排列(我想?)。((1,2)、(3,4)
和(3,4)、(1,2)
)
我尝试过一种递归回溯方法,这种方法很有效,但对于较大的阵列(14-18)来说,它在时间上并不是很有效,对于所有可能的输入,我需要小于2秒的执行时间
这是我的密码:
void gen_sol(int k)
{
if(k > n)
{
//do further calculations
}
else
{
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
if(k == 1)
{
if(!used[i] && !used[j])
{
sol[k] = v[i];
sol[k + 1] = v[j];
used[i] = true;
used[j] = true;
gen_sol(k + 2);
used[i] = false;
used[j] = false;
}
}
else
{
if(sol[k - 2] < v[i] && !used[i] && !used[j])
{
sol[k] = v[i];
sol[k + 1] = v[j];
used[i] = true;
used[j] = true;
gen_sol(k + 2);
used[i] = false;
used[j] = false;
}
}
}
}
}
}
void gen_sol(int k)
{
如果(k>n)
{
//进一步计算
}
其他的
{
对于(int i=1;我可能是你在寻找的?你需要生成所有的排列还是只计算它们?对于每个组合,也许会有帮助?@n.m.我需要检查生成的数组的一些属性。@JesperJuhl@HowardHinnant是的,定制std::next\u排列
可能是一种方法。