zoukankan      html  css  js  c++  java
  • SG函数博弈——poj2311

    关于SG函数的博弈

    首先定义必败态

    x : SG[x]=0

    设任意一个状态y,到所有y能到达的状态连一条边,令这些后继为z

    y : SG[y]=mex(SG[z])

    SG[y]==0 : y就是必败态

    SG[y]!=0 : y就是必胜态

    所以博弈时把状态转换成有向图即可

    那么n个有向图的情况

    SG=SG[1]^SG[2]...^SG[n],即把所有SG异或起来即可 

    本题就是SG函数的应用:首先三个必败态2*2,2*3,3*2,然后将纸片切成两张等价于两个SG函数的异或

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    
    int W,H;
    int sg[205][205];
    
    int SG(int w,int h){
        if(w==2&&h==2 || w==2&&h==3 || w==3&&h==2)return sg[w][h]=0;//必败态 
        if(sg[w][h]!=-1)return sg[w][h];
        int mex[1005]={};
        for(int i=2;i<=w-i;i++)//h不变,用两个sg的异或性质 
            mex[SG(i,h)^SG(w-i,h)]=1;
        for(int i=2;i<=h-i;i++)//w不变 
            mex[SG(w,i)^SG(w,h-i)]=1;
        for(int i=0;i<=1000;i++)
            if(!mex[i])return sg[w][h]=i;
    }
    int main(){
        memset(sg,-1,sizeof sg);
        while(cin>>W>>H){
            //memset(sg,-1,sizeof sg);
            if(SG(W,H)==0)cout<<"LOSE"<<endl;
            else cout<<"WIN"<<endl;
        }
    }
  • 相关阅读:
    h5基本单词
    啦啦
    新内容
    Apache.PHP和MySQL的配置
    static关键字
    访问控制
    PHP Session
    PHP cookie
    全局空间
    使用use操作符导入/使用别名
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10869567.html
Copyright © 2011-2022 走看看