洛谷:P1328:生活大爆炸版石头剪刀布


洛谷:P1328:生活大爆炸版石头剪刀布

题目

P1328:生活大爆炸版石头剪刀布

分析

本题的算法不难,但需要找到一个比较优雅的方法来表示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,但这么做代码量大而且容易出错。

答案

Solution

思考

查表 vs. 规则化:

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

Previous Next