Table of Contents
题目
分析
本题的算法不难,但需要找到一个比较优雅的方法来表示5种手势之间的胜负关系(假定1|0|-1分别代表胜平负三种结果)。本题的说明中已经给出了一个优雅的方式,那就是用二维数组:
| 出拳 \ 0/1/-1 | 剪刀 | 石头 | 布 | 蜥蜴人 | 斯波克 |
|---|---|---|---|---|---|
| 剪刀 | 0 | -1 | 1 | 1 | -1 |
| 石头 | 1 | 0 | -1 | 1 | -1 |
| 布 | -1 | 1 | 0 | -1 | 1 |
| 蜥蜴人 | -1 | -1 | 1 | 0 | 1 |
| 斯波克 | 1 | 1 | -1 | -1 | 0 |
这样一来,(布, 蜥蜴人)的对决就可以通过查表(3,4) = -1获得,表示“布”输给了“蜥蜴人”。如果不用二维数组,可以考虑用若干if...else,但这么做代码量大而且容易出错。
答案

思考
查表 vs. 规则化:
二维查表最直观且不易出错;若希望减少常量表,可以将五种手势线性排成一个环,并定义胜负关系为“向前跨越1或3步为胜,跨越2或4步为负”。例如将手势映射为 0: 剪刀, 1: 石头, 2: 布, 3: 蜥蜴人, 4: 斯波克,则 win(a,b) = ((b - a + 5) % 5 in {1,3})。这种做法代码更短,但需要保证映射顺序与规则一致。
