UVA1378 A funny stone game

博弈论。

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

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 }

 

posted @ 2018-02-09 18:18  大奕哥&VANE  阅读(172)  评论(0编辑  收藏  举报