BZOJ 1022 [SHOI2008]小约翰的游戏John

本文探讨了一种与传统Nim游戏规则相反的游戏——逆Nim游戏,详细分析了游戏的不同局面下的胜负判断方法,并通过代码示例展示了如何实现这些策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题与Nim游戏相反,无法移动的人获胜。

分类讨论:

·记 SG = a1^ a2^ …^ an

(1)每一堆石子的数量都是1:
·若石子的堆数为偶数,先手必胜
·若石子的堆数为奇数,先手必败

(2)至少存在一堆石子的数量大于1:

该情况下,一定存在某一步操作使得当前局面从上述情况(2)变为上述情况(1),即一步将最后一堆大于1的石子变为0或1的操作。记操作前的局面为A,操作后的局面为B。A->B过程中,操作可以选择将这堆石子变为0或1。

根据Nim游戏的定义,本题中,可以令SG≠0代表先手必胜(考虑将A->B时最后一堆石子的变化改为令自己在本题中的条件下失败,则恰好符合Nim游戏定义,故相反可行)。

必胜局面SG≠0,胜者可以通过移动使传递给败者的局面SG=0。而败者局面SG=0,必定会将SG≠0的局面传递给胜者。不断循环,可知SG≠0时必胜。

·若SG≠0,先手必胜
·若SG=0,先手必败

#include<cstdio>
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n, x, SG=0;
		bool allone=1;
		scanf("%d",&n);
		for(int i = 1; i <= n; i++)
		{
			scanf("%d",&x);
			SG^=x;
			if(x!=1)allone=0; 
		}
		if(!allone && SG!=0 || allone && !SG)puts("John");
		else puts("Brother");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值