問題來源
- 《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(順序固定)對應對手的全部組合,再依題意判斷即可!
問題答案
忽然有一種做小學奧數題的感覺——用簡單的知識解決複雜的題——需要一條很清晰的思路……