zoukankan      html  css  js  c++  java
  • UVa 1378 A Funny Stone Game [博弈论 SG函数]

    A Funny Stone Game

    题意:

    $n le 23$堆石子,每次选择$i < j le k$,从$i$拿走1颗$j,k$各放入一颗,不能取就失败。求先手是否必胜以及第一次取的策略


    一开始一直在想游戏怎么会结束...眼残没发现$i<j.....$

    然后,解这类组合游戏问题重要的一步是发现独立的子游戏

    本题中每个石子是互不影响的

    $sg[i]$为一颗在$i$的石子的状态

    $sg[i]=mex{sg[j] oplus sg[k]}$

    然后就$oplus$起来就行了

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const int N=30;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
        return x*f;
    }
    int n,s[N];
    int sg[N],use[N*N];
    int main(){
        freopen("in","r",stdin);
        int cas=0;
        while( (n=read()) ){
            printf("Game %d: ",++cas);
            for(int i=1;i<=n;i++) s[i]=read();
            sg[n]=0;
            for(int i=n-1;i>=1;i--){
                memset(use,0,sizeof(use));
                for(int j=i+1;j<=n;j++)
                    for(int k=j;k<=n;k++) use[ sg[j]^sg[k] ]=1;
                for(int j=0;;j++) if(!use[j]) {sg[i]=j;break;}
            }
            int ans=0;
            for(int i=1;i<=n;i++) if(s[i]&1) ans^=sg[i];
            if(ans!=0){
                int i,j,k;
                for(i=1;i<=n;i++) if(s[i]){
                    int flag=0; ans^=sg[i];
                    for(j=i+1;j<=n;j++){
                        if(ans==0) {k=j,flag=1;break;}
                        for(k=j+1;k<=n;k++) if( (ans^sg[j]^sg[k])==0 ) {flag=1;break;}
                        if(flag) break;
                    }
                    if(flag) break; ans^=sg[i];
                }
                printf("%d %d %d
    ",i-1,j-1,k-1);
            }else puts("-1 -1 -1");
        }
    }
  • 相关阅读:
    Java中的静态方法
    捕获异常代码
    重载与重写的区别
    继承代码
    Android Studio 快捷键一览
    android两种基本联网方式与一种第三方开源项目的使用
    Android Studio导入github下载的project和module
    SlidingMenu 侧滑菜单的用法
    显示图片的(自定义)吐司Toast
    用volley在Genymotion上获取网页源码
  • 原文地址:https://www.cnblogs.com/candy99/p/6543471.html
Copyright © 2011-2022 走看看