洛谷 P1488 肥猫的游戏

在这里插入图片描述
思路:分类讨论
一、和1个三角形相邻
在这里插入图片描述
黑色在最外面,直接取走,JMcat赢
二、和2个三角形相邻
在这里插入图片描述
规律如下表:
在这里插入图片描述

if(n%2)cout<<"PZ Win";
else cout<<"JMcat Win";

JMcat的必败点就是如上图所示,每次拿走一个三角形实际上就是删去一个点,所以知道剩下5个点JMcat必败,因为一个人取一次,即可得出结论。
三、和3个三角形相邻

在这里插入图片描述
规律如下表:
在这里插入图片描述

if(n%2)cout<<"PZ Win";
else cout<<"JMcat Win";

实际上这两种情况是一样的,就如上图,拿走一个三角形之后便变成了第二种情况。

#include <bits/stdc++.h>
using namespace std;
const int N=1e6;
typedef long long ll;
struct tri{
	int index[3];
}t[N];
int point[N];//记录黑色三角形的顶点序号
int main()
{
	int n,i,j;cin>>n;
	for(i=0;i<n-2;++i)
		for(j=0;j<3;j++)
			cin>>t[i].index[j];
	for(j=0;j<3;j++)
		point[t[0].index[j]]=1;//记录黑色三角形的顶点序号
	int tri_num=0;//记录黑色三角形相邻三角形个数
	for(i=1;i<n-1;i++){
		int point_num=0;
		for(j=0;j<3;j++)
			point_num+=point[t[i].index[j]];
		if(point_num==2)tri_num++;//若一个三角形的两个点与黑色三角形相邻,则此三角形与黑色三角形相邻
	}
	if(tri_num==1)cout<<"JMcat Win";
	else if(tri_num==2){//两个三角形与黑色三角形相邻
		if(n%2)cout<<"PZ Win";
		else cout<<"JMcat Win";
	}
	else{//三个三角形与黑色三角形相邻
		if(n%2)cout<<"PZ Win";
		else cout<<"JMcat Win";
	}
	return 0;
}
	

来源:https://www.luogu.com.cn/problemnew/solution/P1488

发布了99 篇原创文章 · 获赞 44 · 访问量 5522

猜你喜欢

转载自blog.csdn.net/weixin_44413191/article/details/103325938