c - 将数组排列成所有可能的对

标签 c arrays algorithm

我正在解决一个问题(在 C 中),它要求我列出偶数个点之间的所有可能连接,以便每个点都只连接到一个其他点。例如,假设我有点 1、2、3 和 4:

  • 1 - 2, 3 - 4
  • 1 - 3, 2 - 4
  • 1 - 4, 2 - 3

点的顺序无关紧要(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

我需要整个排列的数组来执行基于所有连接的计算。

最佳答案

这可以通过非确定性配对最右边未配对的元素并递归来实现。在 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;
    }
}

关于c - 将数组排列成所有可能的对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41924049/

相关文章:

algorithm - 堆排序运行时间

c - 读取但不写入共享变量是否线程安全?

javascript - ReactJS 如何使用状态钩子(Hook)获取超时的文本更改按钮列表?

c# - 在 C# 中将对象列表转换为字节数组

c - 如何存储多个数组并制作指向它们的指针数组

algorithm - 嵌套 For 循环的运行时间

algorithm - 怎么才能扩(logn)!和(登录!)!确定复杂性?

c - 显示二维字符数组

c - 从结构数组中输出随机元素

c - 如何在 C 中绑定(bind)箭头键?