Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 生成给定数组中所有元素对集的有效方法_C++_Backtracking - Fatal编程技术网

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排列
可能是一种方法。