UVA1378 A funny stone game

Posted 大奕哥&VANE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于UVA1378 A funny stone game的主要内容,如果未能解决你的问题,请参考以下文章

UVA1378 A funny stone game

uva 1378 - A Funny Stone Game sg博弈

UVALive 3668 A Funny Stone Game

UVa 12661 Funny Car Racing (dijkstra)

UVA - 12661 Funny Car Racing (Dijkstra算法)

UVa 12661 - Funny Car Racing(Dijkstra)