我给了N个数字,并为他们应用关于他们的顺序的M规则。规则以一对索引表示,每对(A,B)告诉索引A(第A个数字)的数字必须在第B个数字之后 - 它不必在他旁边。
Ex: N = 4
1 2 3 4
M = 2
3 2
3 1
Output: 1234, 4213, 4123, 2134, 2143, 2413, 1423 ...Maybe there are even more:)
该算法应该给我所有可用的排列不会破坏规则,例如 - 3必须始终在2之后和1之后。
我试过强制但它不起作用(虽然强力应该在这里工作,N在范围(1,8)。)
有任何想法吗 ?
就像一个提示。
您可以将您的规则集视为图形。每个索引都是一个顶点,每个规则都是一个有向边。
任何 数字的正确排序(即满足规则的排列)对应于所谓的 拓扑排序 上图。为了生成 所有 您需要生成该图表的所有可能拓扑排序所需的有效数字排序。
附:在链接的维基百科页面上给出的第一个拓扑排序算法已经允许一个相当简单的解决方案,它将枚举所有有效的排列。实施需要一些努力和一些关心,但这不是火箭科学。
暴力强迫将是 经历每一个排列,这是O(N!),并且对于每个排列简单地循环遍历每个规则以确认它们是aplpy,即O(M)。这最终导致O(N!M)有点荒谬,但对于这么小的一组它不应该“不起作用”。
老实说,你最好的办法是回去让蛮力解决方案运作起来。一旦完成(如果你还有时间等),你可以寻找更好的算法。
编辑 向下选民。学生是(应该) 试图按时完成作业。通过它的声音,他的家庭作业是一个编程练习,蛮力的解决方案就足够了。帮助他找出一个有效的算法并没有解决他的真实问题。
在这种情况下,他尝试了简单的蛮力方法(每个人都认为应该适用于小型 N
并且过早地放弃它以尝试可能更困难的事情。任何有经验的开发人员都会告诉你这是一个坏主意。学生需要并且应该被告知,如果他是明智的,他会关注。但显然,这是他的选择......