2011 上海网选 HDU 4023 Game (博弈+人工智能)

著名的博弈玩家Alice and Bob, A有1*2的方块,B有2*1的方块,给出15种大方块,每样最多100个(约去平衡态后这个数据并不是很重要的东西), 没人轮流选在任意方块上放上一个自己专有的方块,不能为者负。

根据每个方块的能被放的情况对方块分类,共5类

1-- 2A  2--2B                                              ///1

3 4-- 1A OR 2B       5 6 --1B OR 2A        ///2

7 8 1A1B OR 1A    9 10--1A1B OR 1B  ///3

11 12 13 14 1A OR 1B                            ///4

15 2A OR 2B                                             ///5

总游戏 其实就是5类游戏的组合游戏,但是SG函数很难找状态,还是找规律约去不影响结果的平衡局势即可。

根据贪心策略 有 5>2>4>3>1

#include <cstdio>
#define min(a,b) (a>b?b:a)
int num[16];
int game[10];
int p[5];
int main ()
{
    int cas;
    scanf("%d",&cas);
    for (int I=1 ; I<=cas ; ++I)
    {
        int tmpmin;
        int turn=0;//表示当前子游戏的先手
        p[0]=0;p[1]=0;//记录约去平衡状态后的每个人的可放个数
        for (int i=0 ; i<15 ; ++i)
        {
            scanf("%d",num+i);
        }
        game[0]=num[0];     game[1]=num[1];             ///1
        game[2]=num[2]+num[3];  game[3]=num[4]+num[5];  ///2
        game[4]=num[6]+num[7];    game[5]=num[8]+num[9];///3
        game[6]=num[10]+num[11]+num[12]+num[13];        ///4
        game[7]=num[14];                                ///5
        
        /**约去平衡态**/
        /// 1
        game[0]>game[1]?p[0]+=2*(game[0]-game[1]):p[1]+=2*(game[1]-game[0]);
        /// 2
        tmpmin=min(game[2],game[3]);
        game[2]-=tmpmin;
        game[3]-=tmpmin;
        /// 3
        tmpmin=min(game[4],game[5]);
        game[4]-=tmpmin;    game[5]-=tmpmin;
        /// 4
        game[6]=game[6]&1;
        /// 5
        game[7]=game[7]&1;

        /// 5>2>4>3>1
        ///**按优先级进行游戏 1情况不影响结果可先处理**///
        ///5
        if(game[7])p[turn]+=2,turn^=1;
        ///2
        if(game[2])
        {
            if(game[2]&1){if(turn == 1)p[1]+=2;  else p[0]+=1; turn^=1 ; }
            p[1]+=game[2]/2*2;
            p[0]+=game[2]/2;
        }
        if(game[3])
        {
            if(game[3]&1){if(turn == 0)p[0]+=2;  else p[1]+=1; turn^=1 ; }
            p[0]+=game[3]/2*2;
            p[1]+=game[3]/2;
        }
        ///4
        if(game[6])
        {
            p[turn]+=1;turn^=1;
        }
        ///3
        if(game[4])
        {
            p[0]+=game[4];
            if(game[4]&1)
            {
                if(turn == 1)p[1]+=1;
                turn^=1;
            }
            p[1]+=game[4]/2;
        }
        if(game[5])
        {
            p[1]+=game[5];
            if(game[5]&1)
            {
                if(turn == 0)p[0]+=1;
                turn^=1;
            }
            p[0]+=game[5]/2;
        }
        ///
        //printf("%d----%d\n",p[0],p[1]);
        printf("Case #%d: %s\n",I,p[0]>p[1]?"Alice":"Bob");
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值