洛谷P5932 [POI1999]多边形之战
题目链接
题目背景
多边形之战是一个双人游戏。
题目描述
游戏在一个有 n 个顶点的凸多边形上进行,这个凸多边形的 n−3 条对角线将多边形分成 n-2 个三角形,这 n−3 条对角线在多边形的顶点相交。
三角形中的一个被染成黑色,其余是白色。双方轮流进行游戏,当轮到一方时,他必须沿着画好的对角线,从多边形上切下一个三角形。切下黑色三角形的一方获胜。
- 注:如果连接一个多边形中任意两点的线段都完全包含于这个多边形,则称这个多边形为凸多边形。
输入格式
第一行是一个整数 n。表示多边形的顶点数,多边形的顶点从 0 到 n-1 顺时针标号。
接着的 n-2 行描述组成多边形的三角形。第 i+1 行,(1 leq i leq n-2),有三个空格分隔的非负整数 a, b, c,它们是第 i 个三角形的顶点编号,第一个给出的三角形是黑色的。
输出格式
唯一一行应包含一个单词:
TAK
,表示先走的一方有必胜策略。NIE
,表示先走的一方没有必胜策略。
输入输出样例
输入 #1
6
0 1 2
2 4 3
4 2 0
0 5 4
输出 #1
TAK
说明/提示
对于所有的数据,(4 le n le 50000)。
题目分析
本题是博弈中的基础题,解题关键在于如何判断出获胜方,获胜取决于构造出多边形中黑三角的位置,那么就需要对黑三角所有可能出现的位置进行分类找到共性。
解题思路
可以将所有可能情况分为以下三类:
-
黑三角位于多边形最外层,第一次就可以切掉,那么先手直接获胜。
-
黑三角有一条边是多边形的外层,这种情况游戏进行到最后一定会出现如下情况,也就是说轮到谁切倒数第二块三角形谁获胜,那么就很容易看出,这种情况下谁获胜与三角形数量的奇偶性有关。
-
黑三角位于多边形内部,这种情况游戏进行到最后同样会出现如2中所示情况,获胜同样与三角形数量的奇偶性相关。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[3];
int x,y,z;
int main()
{
cin>>n;
cin>>a[0]>>a[1]>>a[2]; //黑色三角形顶点
for(int i=0;i<n-3;i++)
cin>>x>>y>>z; //依照题目要求象征性输入一下,解决本题不需要
sort(a,a+3);
if((a[2]==a[1]+1&&a[1]==a[0]+1)||(a[0]==0&&a[1]==1&&a[2]==n-1)||(a[0]==0&&a[1]==n-2&&a[2]==n-1)) //判断三个顶点是否连续,连续则代表黑色三角形在边上可以直接切
cout<<"TAK";
else
{
if(n&1) cout<<"NIE"; //黑三角不在外围时通过奇偶判断输赢,n&1是位运算相当于判断n%2==1
else cout<<"TAK";
}
return 0;
}