标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3062 Accepted Submission(s): 1709
反尼姆博弈(anti-nim)
该类问题的判定方法:
下面是从知乎找到的分析↓
奇异局势,所有堆的xor和==0.
假定S是非奇异局势,T是奇异局势。
一堆中石子数量>=2,表示充裕堆, =1表示孤单堆。
S0即非奇异局势下,充裕堆为0的状态
S1即非奇异局势下,充裕堆为1的状态
S2即非奇异局势下,充裕堆>=2的状态
T0即奇异局势下,充裕堆为0的状态
T2即奇异局势下,充裕堆>=2的状态
1.奇异局势的定义可知,S能转移到T,能转移到S, T只能转移到S
2.S0必败,T0必胜
3.S1必胜,因为S1只需要转移到S0即可。
4.S2必胜,T2必败。
1)T2只能转移到S1 和 S2
2)若T2转移到S1 则T2败,若T2转移到S2,S2只需要转回到T2即可。所以S2胜,T2败。
所以:
必胜态:T0,S1,S2
必败态:S0,T2
另外还有一篇比较详细的证明分析:http://qianmacao.blog.163.com/blog/static/20339718020123555821140/
然后是代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 int main(){ 8 int n; 9 while(scanf("%d",&n)!=EOF){ 10 int i,j; 11 int s=0;bool flag=0; 12 for(i=1;i<=n;i++){ 13 scanf("%d",&j); 14 s^=j; 15 if(j>1)flag=1; 16 } 17 if(!flag){//充裕堆为0 18 if(n%2)//堆数为奇数,必败 19 printf("No\n"); 20 else printf("Yes\n"); 21 } 22 else{//充裕堆>0 23 if(s==0)//奇异局势 24 printf("No\n"); 25 else 26 printf("Yes\n"); 27 } 28 } 29 return 0; 30 }
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5658629.html