zoukankan      html  css  js  c++  java
  • 组合博弈uva 11137

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正

        刘汝佳《练训指南》上的博弈例题

        用到了组合游戏和的观点

        每日一道理
    曾经辉煌过,曾经凋零过,这可是你至死不渝的生活吗?我亲爱的母亲—大自然。多少次,我伏在地上,去聆听你沉重的脉搏声;多少次,我伫立在山前,去感受那松涛千年的浩瀚。你的豪壮,足以让中华民族腾飞;你的无私,谱写了一曲曲感人至深的千古壮曲。
    #include <cstdio>
    #include <cstring>
    typedef long long ll;
    using namespace std;
    
    int sg[210],len;
    char s[210];
    bool ok[210],can[210];
    
    void init(){
        bool vis[210];
        int i,j;
        memset(sg,0,sizeof(sg));
        sg[0]=0,sg[1]=1,sg[2]=1,sg[3]=1;
        for(i=4;i<=200;i++){
            memset(vis,0,sizeof(vis));
            for(j=3;j<=5 && j<=i;j++)
                vis[sg[i-j]]=1;
            for(j=1;j+5<=i;j++)
                vis[sg[j]^sg[i-j-5]]=1;
            for(j=0;;j++) if(vis[j]==0)break;
            sg[i]=j;
        }
    }
    
    bool solve(){
        int i,j;
        bool flag=0,first;
        for(i=0;i<len;i++){
            if(s[i]=='X'){
                if(i<len-1 && i>=1 && s[i-1]=='X'){
                    if(flag==0){
                        printf("WINNING\n");
                        flag=1;
                        first=1;
                    }
                    if(first==1){
                        printf("%d",i+2);
                        first=0;
                    }
                    else printf(" %d",i+2);
                }
                if(i<len-1 && i>=1 && s[i+1]=='X'){
                    if(flag==0){
                        printf("WINNING\n");
                        flag=1;
                        first=1;
                    }
                    if(first==1){
                        printf("%d",i);
                        first=0;
                    }
                    else printf(" %d",i);
                }
                if(i>=2 && s[i-2]=='X'){
                    if(flag==0){
                        printf("WINNING\n");
                        flag=1;
                        first=1;
                    }
                    if(first==1){
                        printf("%d",i);
                        first=0;
                    }
                    else printf(" %d",i);
                }
            }
        }
        if(flag){
            puts("");
            return 1;
        }
        return 0;
    }
    
    int getans(bool * ok){
        int cou=0,i,ans=0;
        for(i=0;i<len;i++){
            if(ok[i]) cou++;
            else if(ok[i]==0){
                ans^=sg[cou];
                cou=0;
            }
        }
        ans^=sg[cou];   //这里不要忘了
        return ans;
    }
    
    int main(){
        int t,T,i,j,ans;
        init();
        scanf("%d",&T);
        for(t=1;t<=T;t++){
            scanf("%s",s);
            len=strlen(s);
            bool flag=solve();
            if(flag==0){
                for(i=0;i<len;i++) ok[i]=1;
                for(i=0;i<len;i++)
                    if(s[i]=='X')
                        for(j=i-2;j<=i+2;j++)
                            if(j>=0 && j<len) ok[j]=0;
                ans=getans(ok);
                if(ans==0) printf("LOSING\n\n");
                else{
                    printf("WINNING\n");
                    bool first=1;
                    for(i=0;i<len;i++){
                        if(ok[i]){
                            for(j=0;j<len;j++) can[j]=ok[j];
                            for(j=i-2;j<=i+2;j++)
                                if(j>=0 && j<len) can[j]=0;
                            ans=getans(can);
                            if(ans==0){
                                if(first==1){
                                    printf("%d",i+1);
                                    first=0;
                                }
                                else printf(" %d",i+1);
                            }
                        }
                    }
                    puts("");
                }
            }
        }
    }

    文章结束给大家分享下程序员的一些笑话语录: Google事件并不像国内主流媒体普遍误导的那样,它仅仅是中国Z府和美国公司、中国文化和美国文化甚至中国人和美国人之间的关系,是民族主义和帝国主义之间的关系;更重要的是,它就是Z府和公司之间的关系,是权力管制和市场自由之间的关系。从这个意义上说,过度管制下的受害者,主要是国内的企业。Google可以抽身而去,国内的企业只能祈望特区。www.ishuo.cn

  • 相关阅读:
    1028 人口普查 (20分)
    1027 打印沙漏 (20分)
    1026 程序运行时间 (15分)
    1025 反转链表 (25分)
    1024 科学计数法 (20分)
    1023 组个最小数 (20分)
    1022 D进制的A+B (20分)
    1021 个位数统计 (15分)
    1020 月饼 (25分)
    1019 数字黑洞 (20分)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3052280.html
Copyright © 2011-2022 走看看