我正在处理一个问题(在C中),它要求我列出偶数个点之间的所有可能连接,以便每个点只连接到另一个点。例如,假设我有第1,2,3和4点:
点的顺序无关紧要(1 - 2与2 - 1相同),连接顺序也不一样(1 - 2,3 - 4与3 - 4,1 - 2相同) )。
我目前正在尝试简单地将{1, 2, 3, 4}
等数组排序为所有可能的排序,并检查它是否已经生成。然而,这可能非常昂贵,并且还需要忽略点和对的排序。
将数组排列到所有可能的对中会有什么更好的方法?我们将非常感谢算法的基本概要!
编辑:在上面带有{1, 2, 3, 4}
的示例中,如果配对表示为数组中的两个相邻元素,则所有可能的结果将是:
{1, 2, 3, 4}
:1 - 2,3 - 4 {1, 3, 2, 4}
:1 - 3,2 - 4 {1, 4, 2, 3}
:1 - 4,2 - 3 我需要整个排列的数组来执行基于所有连接的计算。
答案 0 :(得分:1)
这可以通过不确定地配对最右边的未配对元素和递归来实现。在C:
void enum_matchings(int n, int a[static n]) {
if (n < 2) {
// do something with the matching
return;
}
for (int i = 0; i < n-1; i++) {
int t = a[i];
a[i] = a[n-2];
a[n-2] = t;
enum_matchings(n-2, a);
a[n-2] = a[i];
a[i] = t;
}
}