我正在研究一个问题(用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我需要整个排列好的数组来执行基于所有连接的计算。
发布于 2017-01-29 17:56:13
这可以通过不确定地配对最右边的未配对元素和递归来实现。在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;
}
}
https://stackoverflow.com/questions/41924049
复制相似问题