Luogu P1488博弈论 肥猫的游戏
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
4≤n≤5×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博弈论 肥猫的游戏的主要内容,如果未能解决你的问题,请参考以下文章
ybtoj 博弈论课堂过关luogu P1247luogu P2197模板nim 游戏 & 取火柴游戏 &例题1取火柴游戏