zoukankan      html  css  js  c++  java
  • 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
    ",i-1,j-1,k-1);
    47             flag=1;break;
    48         }
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    KSTORE日常工作遇到问题总结
    调用bat文件执行java文件
    腾讯课堂十大Excel函数
    《将博客搬至CSDN》
    oracle 累加功能,累加百分比
    验证身份证是否合法
    远程登录修改密码
    二叉树的遍历
    nginx启动、重启、关闭
    状态模式-State-订单状态
  • 原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8436520.html
Copyright © 2011-2022 走看看