洛谷P1488 肥猫的游戏

题目链接

题目描述
野猫与胖子,合起来简称肥猫,是一个班的同学,他们也都是数学高手,所以经常在一起讨论数学问题也就不足为奇了。

一次,野猫遇到了一道有趣的几何游戏题目,便拿给胖子看。游戏要求在一个有 n 个顶点凸多边形上进行,这个凸多边形的 n−3 条对角线将多边形分成 n−2 个三角形,这 n−3 条对角线在多边形的顶点相交。三角形中的一个被染成黑色,其余是白色。

双方轮流进行游戏,当轮到一方时,他必须沿着画好的对角线,从多边形上切下一个三角形。切下黑色三角形的一方获胜。胖子一看觉得确实很有趣,不如就一起玩玩吧。假设游戏由野猫先开始,那么野猫是否有必胜的策略呢?请写一个程序帮助野猫算一算。

输入格式
第一行为一个整数 n,表示多边形的顶点数,多边形的顶点由 0 至 n−1 顺时针标号。

接着的 n−2 行描述组成多边形的三角形。第 i+1 行 (1≤i≤n−2) 有三个空格分隔的非负整数 a 、b 、c ,它们是第 i 个三角形的顶点编号。第一个给出的三角形是黑色的。

输出格式
只有一行,倘若野猫有必胜策略,输出 JMcat Win;否则,输出 PZ Win(注意大小写和空格)。

输入输出样例
输入 #1
6
0 1 2
2 4 3
4 2 0
0 5 4
输出 #1
JMcat Win
说明/提示
4≤n≤5×104

如果连接一个多边形中任意两点的线段都完全包含于这个多边形,则称这个多边形为凸多边形。

代码:

//P1488 肥猫的游戏
#include
using namespace std;
int n, x, y, z, xx, yy, zz;
int jud0()
{
     
	int ans =0 ;
	if(abs(xx - yy) == 1) ans++;
	if(abs(xx - zz) == 1) ans++;
	if(abs(yy - zz) == 1) ans++;
	if(xx == 0)
	{
     
		if(yy == n - 1 || zz == n - 1) ans++;
	}
	if(yy == 0)
	{
     
		if(xx == n - 1 || zz == n - 1) ans++;
	}
	if(zz == 0)
	{
     
		if(xx == n - 1 || yy == n - 1) ans++;
	}
	return ans;
}

int main()
{
     
	cin >> n;
	for(int i = 0; i < n - 2; i++)
	{
     
		scanf("%d%d%d", &x, &y, &z);
		if(!i)
		{
     
			xx = x;
			yy = y;
			zz = z;
		}
	}
	if(jud0()==2)
	{
     
		cout << "JMcat Win" << endl;
		return 0;
	}
	if(n % 2 == 1) cout << "PZ Win" << endl;
	else cout << "JMcat Win" << endl;
}

你可能感兴趣的:(算法入门,游戏,博弈论,肥猫的游戏,洛谷,c++)