1. 问题描述
有3 个课外小组:物理组,化学组和生物组。今有张、王、李、赵、陈5 名同学,已知张、王为物理组成员,张、李、赵为化学组成员,李、赵、陈为生物组成员。如果要在3 个小组中分别选出3 位组长,一位同学最多只能担任一个小组的组长,共有种选择方案?
2. 思路分析
我们用字母 A 代表张同学,字母 B 代表王同学,字母 C 代表李同学,字母 D 代表赵同学,字母 E 代表陈同学。把这几位同学所对应的小组,展现在一张表中:
张 | 王 | 李 | 赵 | 陈 | |
---|---|---|---|---|---|
物理组 | A | B | |||
化学组 | A | C | D | ||
生物组 | C | D | E |
我们用字符串记录每个小组的成员,物理组 a="AB",化学组 b="ACD",生物组 c="CDE",我们用最笨的方法来翻译,“一位同学最多只能担任一个小组的组长” 这句话。
我们定义一个三重循环:
外层循环 i = 1 到 2
中层循环 j = 1 到 3
内层循环 k = 1 到 3
内部判断模块
对于内部判断模块来说,假定选 a[i] 为物理组组长,b[j] 为化学组组长, c[k] 为生物组组长,那么一个同学最多只能担任一个小组长,需要进行三个判断:
- a[i] 不能和 b[j] 相等,即物理组长和化学组长不能是一个人,用Raptor中的语句表述就是 a[i] != b[j];
- a[i] 不能和 c[k] 相等,即物理组长和生物组长不能是一个人,用Raptor中的语句表述就是 a[i] != c[k];
- b[j] 不能和 c[k] 相等,即化学组长和生物组长不能是一个人,用Raptor中的语句表述就是 b[j] != c[k]。
这三个条件都要满足,才能达到题目中 “一位同学最多只能担任一个小组的组长” 的要求。大家可以自己试一试,如果那个条件不满足会怎么样。
现在核心判断部分达成了,就可以得到如下的伪代码了:
外层循环 i = 1 到 2
中层循环 j = 1 到 3
内层循环 k = 1 到 3
如果 a[i] != b[j], a[i] != c[k] 和 b[j] != c[k] 同时满足
组长选择方案 + 1
本题中同时满足的逻辑运算符为 and,通过把伪代码翻译成Raptor流程图,就彻底实现题目中的目标了。
3. 流程图
为了更好的展示每一种情况,我在流程图中对每一种满足题目要求的方案进行了输出,测试结果如下。
4. 结果
把我们前面定义的符号意义 “字母 A 代表张同学,字母 B 代表王同学,字母 C 代表李同学,字母 D 代表赵同学,字母 E 代表陈同学” 带进去就 OK 了。