首先尝试解决一个更简单的问题。尝试输出所有可能的混合具有两个约束的类:
一天不能出现超过一次的课程
一天的课程顺序无关紧要
像往常一样,回溯问题最容易用递归来解决。执行以下操作:以任何顺序 cs,cs,cs,m,m,m,p,p 获取类的序列,并在递归的每一步将下一个类分配给“可能”的一天。如果到目前为止分配的班级少于 3 个,并且还没有相同类型的班级,那么一天是可能的。
为了避免重复的可能性,增加了一个要求 - 如果在递归的当前步骤中,我们需要将 A 类分配给某天并且 A 类已经添加到某些天,那么只尝试将 A 分配给几天后在一周内,然后是它被分配到的最后一个。由于这听起来有点令人困惑,让我举个例子:
假设我们有当前状态:
M: m, cs
T: 0
W: cs
T: p
F: p
下一步我们必须添加一个cs类。如上所述,我们只会在 W 之后的几天尝试,即星期四和星期五。这需要一些考虑,但您应该能够弄清楚,如果我们不添加此限制,则可能会发现不止一次。
递归结束有两种情况:
现在解决了这个更容易的问题,尝试删除我添加的两个附加约束。首先修改解决方案,使一个类可能一天出现一次以上(尽管在这种情况下问题似乎更简单,需要额外的工作来避免多次计算某些可能性)。在此之后删除最后剩余的约束 - 使一天中的课程顺序很重要。有一种简单的方法,但我不确定在您陈述问题时是否允许 - 在找到解决方案后,在其中的所有日子里进行所有排列以生成所有可能的安排。
我真的希望这个答案有所帮助。我可以写下我上面提到的所有问题的解决方案,但我更愿意尝试给你一些提示,告诉你如何自己解决这些问题,这样你就可以自己动手了。