poj2234(Matches Game 尼姆博弈)

       题目链接:http://poj.org/problem?id=2234

      以下分析内容转载自:http://blog.csdn.net/kongming_acm/article/details/5731584http://

       

随机博弈指的是这样的一个博弈游戏,目前有任意堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,规则如下:

1)每一步应取走至少一枚石子;每一步只能从某一堆中取走部分或全部石子;

2)如果谁取到最后一枚石子就胜。

也就是尼姆博弈(Nimm Game)。

必败局面:也叫奇异局势无论做出何出操作,最终结果都是输的局面。必败局面经过2次操作后,可以达到另一个必败局面。

必胜局面:经过1次操作后可以达到必败局面。

即当前局面不是必败局面就是必胜局面,而必胜局面可以一步转变成必败局面。

最终状态:
(1)最后剩下一堆石子;(必胜局面)

(2)剩下两堆,每堆一个;(必败局面)

(3)当石子剩下两堆,其中一堆只剩下1颗,另一堆剩下多于n颗石子时,当前取的人只需将多于1颗的那一堆取出n-1颗,则局面变为刚才提到的必败局面。(必胜局面)

判断当前局势是否为必胜(必败)局势:
1)把所有堆的石子数目用二进制数表示出来,当全部这些数按位异或结果为0时当前局面为必败局面,否则为必胜局面;
2)在必胜局面下,因为所有数按位异或的结果是大于零的,那么通过一次取,将这个(大于其它所有数按位异或的结果的)数下降到其它所有数按位异或的结果,这时局面就变为必败局面了。

定理:一组自然数中必然存在一个数,它大于等于其它所有数按位异或的结果。

证明:原命题等价于,设a1a2...an=p,p≠0时,必存在k,使得ak^p<ak(当p=0时,对于任意的k,有ak^p=ak)。
设p的最高位是第q位,则至少存在一个k,使得ak的第q位也是1,而akp的第q位为0,所以ak^p<ak
    补缀一点,(a
bb=a(bb)=a0=a,所以akp相当于“其它所有数按位异或的结果”。

例12 45 45

45^45=0,45和45的异或等于0。

例 23 3 6 9

局势(3,6,9)因为3^6^9不等于0,所以这是一个必胜局势。

 3 011

^6 110

 5 101 

即从第3堆中的9个中取走9-5=4个,则(3,6,9)->(3,6,5),3^6^5=0,故(3,6,5)为奇异局势,即从必胜局势转变成必败局势。

附几种常见的博弈:http://blog.csdn.net/kath_y/article/details/7570382

代码:

#include<stdio.h>
int pile[25];
int M;
int ans;
int main()
{
	int i;
	while(scanf("%d",&M)!=EOF)
	{
		for(i=0;i<M;i++)
			scanf("%d",&pile[i]);
		ans=pile[0];
		for(i=1;i<M;i++)
			ans ^= pile[i];
		if(ans == 0)
			printf("No\n");
		else 
			printf("Yes\n");
	}

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值