楼主,终于弄出来了。一开始看题目的时候感觉不是很复杂,但实际做的时候发现比想象的要复杂一点。复杂之处在于每个监考教师可监考的次数不同。这种题目只有两种解法:以考场去找老师;以老师去找教室。
刚开始时我用了第一种解法,也就是全随机地以考场去找老师,找老师的条件是两个:1、该老师还有监考次数;2、该老师没有安排过当前课程的监考。但运行了几次后发现了问题:最后几个考场总是找不到老师。这是因为可监考次数少的老师前面被随机分配掉了,已没有监考次数;监考次数够的老师却在前面已经安排过该门课程的监考。用这种方法解题应该还有以下条件:1、所有老师的可监考次数相加应大于或等于监考位置总数(这个条件题目是满足的);2、所有老师的可监考数完全相等(这个条件题目没满足)。
然后,我换了第二种解法:以老师去找教室。这就是半随机了,因为其中掺杂了人工干预。思路大致是:把监考老师按照可监考次数的不同分开,存放在不同数组里。先安排可监考4次的老师:每门课程各安排一次,但是每门课程安排在哪个考场,以及安排在该考场的甲位还是乙位,就由程序随机安排;可监考3次的老师:随机抽取其中三门课程安排监考;可监考2次的老师:随机抽取其中两门课程安排监考;只监考1次的老师:在安排完上述三种老师以后,以循环方式填充到剩下的各个监考空位里。在安排可监考3次和可监考2次老师的过程中有一些细节要注意:1、四取三和四取二有很多种组合,应该全部考虑到;2、判断系统随机分配的甲位或乙位是否有用完,如有,则应换到同一考场的另一个位置。比如:系统随机安排了某老师在Jk3y监考位,但所有考场的Jk3y监考位都用完了,那么系统应该将其安排到Jk3j监考位中。这两个位置都是对第三门课程的监考,换一下不会对最后结果产生影响。3、若某门课程的所有考场甲乙监考位(共20个)都已用完,则不应再让程序能随机取到该分配方案。这种情况可能会在安排可监考次数为2的老师中出现。
附上运行结果截图:
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
我没有对运行结果中的老师进行具体的对位检查,看其安排的次数是否符合Jsxx中的监考场数,楼主可自己检测一下。另外,你给出的数据中,可监考次数为4、3、2、1的老师刚好各8名。我写的代码考虑到了允许这四种老师人数不等,甚至有些监考次数的老师不存在这些情况,但没有具体测试过。你可以变换一下数据,测试一下。
附上程序代码(包括全随机和半随机两种):
程序代码中有很详细的注释语句,若有疑问,可跟帖继续讨论。