问题来源
- 《C程序设计》 第6章 循环控制 6.15
- 《C程序设计教程》 第5章 循环控制 5.15
问题描述
两个乒乓球队进行比赛,各出3个。甲队为 A、B、C 3人,乙队为 X、Y、Z 3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比,请编程序找出3对赛手的名单。
之所以拿这个题目来讲,是因为有些郁闷——如此简单的题目竟然耗费了我相当长的一段时间。
咋看这道题目,脑子里无非是穷举、列表等想法……然后使用了两层的for循环对每个队员进行匹配,想草草了事,但可惜只穷举出了一对一(one vs one)的所有可能。
显然这不是题目所要求的。
做到这里有点郁闷,脑子里开始浮想出数组、递归函数之类的概念……
然后开始搜索网络上天花乱坠的答案,看到了各种各样的解法,用到了各种各样的知识点:数组、字符串……
最后还是被心里一个尖锐的声音喊住了——不对!!!虽然数组甚至递归函数这些东西的确是可以完成这道题目,但不应该是这样子的!——因为既然这道题目扔在这章的后面,显然它不需要用到后面的那些知识。 ——既然如此,那就应该有只依靠简单的变量类型、逻辑语句以及本章主打的循环控制组成的解法就可以完成它!——但,到底是什么呢?
……
于是在纸上列出了两种形式的表
ABC
X 011
Y 110
Z 110
上面这个表出现了和我一开始写的算法一样的结果——各个队员可能的对手,但没有得出一个整体的比赛次序。
然后我又尝试做了另一种列表,并将不符合要求的组合去掉——于是答案出来了:
ABC
XYZ
XZY
YXZ
YZX
ZXY
ZYX
A的对手是Z,B的对手是X,C的对手是Y。而算法也显而易见——穷举出ABC(顺序固定)对应对手的全部组合,再依题意判断即可!
问题答案
忽然有一种做小学奥数题的感觉——用简单的知识解决复杂的题——需要一条很清晰的思路……