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 }
  • 相关阅读:
    DDK 的一些笔记
    C# 32位程序访问64位系统注册表
    自己对设备栈的理解
    简单驱动编写与windbg调试
    DDK 的一些笔记other
    USB设备的一些概念
    C# 32位程序与64位程序读\写注册表的区别
    dbca建库时找不到ASM磁盘
    sf01_什么是数据结构
    cPickle.dump函数
  • 原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8436520.html
Copyright © 2011-2022 走看看