码迷,mamicode.com
首页 > 其他好文 > 详细

UVA1378 A funny stone game

时间:2018-02-09 22:19:37      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:bre   bool   print   for   函数   pre   nbsp   通过   class   

博弈论。

就是有一堆石子你拿走一堆中的一个,然后再向后面两堆中加两个问胜负

i<j<=k

所以我们可以直接通过sg函数计算,考虑问题的奇偶性,如果这一位是奇的我们才考虑,偶的可以模仿

然后对所有sg异或一下,找到三个数异或起来能使当前先手必败即可。

By:大奕哥

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int sg[25],a[25],v[105],n,cnt;
 4 void init()
 5 {
 6     for(int i=1;i<=24;++i)
 7     {
 8         memset(v,0,sizeof(v));
 9         for(int j=1;j<i;++j)
10         for(int k=1;k<=j;++k)
11         {
12             v[sg[j]^sg[k]]=1;
13         }
14         int pos=0;
15         while(1)
16         {
17             if(!v[pos]){sg[i]=pos;break;}
18             pos++;
19         }
20     }
21     return;
22 }
23 int main()
24 {
25     init();
26     while(~scanf("%d",&n)&&n)
27     {
28         int ans=0;
29         for(int i=1;i<=n;++i)
30         {
31             scanf("%d",&a[i]);
32             if(a[i]&1)
33             ans^=sg[n-i+1];
34         }
35         printf("Game %d:",++cnt);
36         if(!ans)
37         puts(" -1 -1 -1");
38         bool flag=0;
39         for(int i=1;i<n;++i)
40         if(a[i]&&!flag)
41         for(int j=i+1;j<=n;++j)
42         if(!flag)
43         for(int k=j;k<=n;++k)
44         if((ans^sg[n-i+1]^sg[n-j+1]^sg[n-k+1])==0)
45         {
46             printf(" %d %d %d\n",i-1,j-1,k-1);
47             flag=1;break;
48         }
49     }
50     return 0;
51 }

 

UVA1378 A funny stone game

标签:bre   bool   print   for   函数   pre   nbsp   通过   class   

原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8436520.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!