由乒乓球队问题想到的

问题来源

  • 《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

011

110

110

上面这个表出现了和我一开始写的算法一样的结果——各个队员可能的对手,但没有得出一个整体的比赛次序。

然后我又尝试做了另一种列表,并将不符合要求的组合去掉——于是答案出来了:

 ABC

 XYZ 

 XZY 

 YXZ 

 YZX 

 ZXY

 ZYX 

A的对手是Z,B的对手是X,C的对手是Y。而算法也显而易见——穷举出ABC(顺序固定)对应对手的全部组合,再依题意判断即可!


问题答案

忽然有一种做小学奥数题的感觉——用简单的知识解决复杂的题——需要一条很清晰的思路……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值