Luogu P1488博弈论 肥猫的游戏

Posted SSL_ZZL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P1488博弈论 肥猫的游戏相关的知识,希望对你有一定的参考价值。

Luogu P1488 肥猫的游戏

Luogu P1488 肥猫的游戏


题目描述

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

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

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

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

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

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

输入输出样例
输入

6
0 1 2
2 4 3
4 2 0
0 5 4

输出

JMcat Win

说明/提示
4 ≤ n ≤ 5 × 1 0 4 4 \\leq n \\leq 5 \\times 10^4 4n5×104

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


解题思路

分类讨论黑块周围有多少白块
第一种情况,黑块粘着一个白块,那JMcat就可以直接把黑块砍下来,JMcat必赢
第二种情况,黑块粘着两个白块

  • 整个多边形只有两个白块,那PZ必赢
  • 整个多边形有三个白块,JMcat先砍一个不粘黑块的白块,PZ只能砍和黑块粘着的白块,JMcat必赢
  • 整个多边形有四个白块,两个人先把不粘黑块的白块切掉,得到第一个点的情况,PZ赢

白块有偶数个,PZ赢;白块有奇数个,JMcat赢
第三种情况,黑块粘着三个白块,结论与第二种情况一样


Code

#include <bits/stdc++.h>

using namespace std;

struct DT
	int a, b, c;
;

int n, ans, now, tong[50010];
DT a[50010];

int main() 
	scanf("%d", &n); n -= 2;
	for(int i = 1; i <= n; i ++)
		scanf("%d %d %d", &a[i].a, &a[i].b, &a[i].c);
	tong[a[1].a] = tong[a[1].b] = tong[a[1].c] = 1;
	for(int i = 2; i <= n; i ++) 
		int now = 0;
		if(tong[a[i].a]) now ++;
		if(tong[a[i].b]) now ++;
		if(tong[a[i].c]) now ++;
		if(now == 2) ans ++;  //共有两点=》共有一条边
	
	if(ans == 1) printf("JMcat Win");
	else 
		if((n - 1) % 2 == 0) printf("PZ Win");
			else printf("JMcat Win");
	

以上是关于Luogu P1488博弈论 肥猫的游戏的主要内容,如果未能解决你的问题,请参考以下文章

题解 P1488 肥猫的游戏

luogu P1489 猫狗大战

ybtoj 博弈论课堂过关luogu P1247luogu P2197模板nim 游戏 & 取火柴游戏 &例题1取火柴游戏

[匈牙利算法][博弈] Luogu P1971 兔兔与蛋蛋

猫的英文Cat,怎么发音?

博弈论的一些结论