我正在寻找一种算法,给定一组数字 {0, 1, 2, 4, 5...} 和一组关于每个元素的相对位置的条件,它将检查是否存在有效的排列。条件总是类型为“原始数组中位置 i 的元素必须是位置 j 或 z 中的元素的下一个(相邻)元素”。
排列中的最后一个元素和第一个元素被认为是相邻的。
这是一个简单的例子:
让数字为 {0, 1, 2, 3}
和一组条件:a0 必须在 a1 旁边,a0 必须在 a2 旁边,a3 必须在 a1 旁边
这个示例的有效解是 {0, 1,3,2}。
请注意,此解决方案的任何旋转/对称性也是有效的解决方案。我只需要证明存在这样的解决方案。
使用相同集合的另一个示例:
a0 必须在 a1 旁边,a0 必须在 a3 旁边,a0 必须在 a2 旁边。
此示例没有有效的解决方案,因为一个数字只能与 2 个数字相邻。
我现在唯一能想到的想法就是使用某种回溯。
如果存在解决方案,这应该会快速收敛。如果不存在解决方案,我无法想象有任何方法可以避免检查所有可能的排列。正如我已经说过的,旋转或对称不会影响给定排列的结果,因此应该可以减少可能性的数量。