加载中...

洛谷P5932[POI1999]多边形之战(C++,博弈论)详细解析+代码注释

洛谷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\)


题目分析

本题是博弈中的基础题,解题关键在于如何判断出获胜方,获胜取决于构造出多边形中黑三角的位置,那么就需要对黑三角所有可能出现的位置进行分类找到共性。

解题思路

可以将所有可能情况分为以下三类:

  1. 黑三角位于多边形最外层,第一次就可以切掉,那么先手直接获胜。

    image1

  2. 黑三角有一条边是多边形的外层,这种情况游戏进行到最后一定会出现如下情况,也就是说轮到谁切倒数第二块三角形谁获胜,那么就很容易看出,这种情况下谁获胜与三角形数量的奇偶性有关。

    image2

  3. 黑三角位于多边形内部,这种情况游戏进行到最后同样会出现如2中所示情况,获胜同样与三角形数量的奇偶性相关。

    image3

代码

#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;
}
posted @ 2022-01-23 13:02  我没有bug  阅读(115)  评论(0编辑  收藏  举报