ConvexPolygonGame

作者:袁伟强

关键词:博弈 计算几何

题目简述

给一个格点凸多边形,两个人轮流操作。每次操作需要画一个格点凸多边形,满足该多边形的顶点在上一个多边形的内部或边界上,但不能和上一个多边形的顶点重合。求是先手必胜还是后手必胜。

为初始时多边形顶点数)

为顶点坐标)

结论及其证明

这题有一个结论:如果先手一开始可以操作,那么是先手必胜,否则是后手必胜。下面给出证明。

如果先手一开始无法操作,肯定是后手必胜,设为这类多边形的集合。对于一个格点凸多边形,记为通过能得到的多边形组成的集合。由于被新多边形包含的格点必然也被原多边形包含,所以对于任意,都有 。由于内的格点数目是有限的,所以内的格点数目是有限的,即是有限集。

下面我们采用反证法,假设存在,且对于,均有。我们称一个序列为操作序列,当且仅当对任意,均有。下面我们用归纳法证明我们可以构造出任意长度的操作序列且满足时,为操作序列。已知当时,为操作序列,则当时,由于,所以,即,任取,则为操作序列。对于任意,于是。而对于任意,均有,故为无限集,这与之前得到的结论相矛盾。至此,该结论得证。

判断一个多边形是否属于,只需要判断内的格点是否共线。若共线,显然W;若不共线,只要找到任意不共线的三点就可以组成三角形,则

算法

现在我们的问题变成了判断该多边形内的格点是否共线。注意到一条线上的格点数不超过,我们可以直接去统计多边形内的所有格点,一旦超过,就可以直接break。如何去找到这些点?我们可以直接暴力枚举,与相交的边最多只有条。我们求出这两条边与的交点,将两个交点之间的格点加入到我们所要求的点集中(注意排除顶点)。找到所有点后,只需取前两个点,判断其他点是否都与它们共线即可,当然该过程可以在加点的时候完成。判断共线可以用叉积。

时间复杂度

results matching ""

    No results matching ""