hdu 4023 - Game

题目:Alice还有Bob 轮流在已知的15中俄罗斯方块上放置瓷砖,Alice放置的是垂直的2*1的矩形;

           Bob放置的是水平的1*2的矩形,Alice 先开始放,最后没位置可以放者输,判断胜者。

分析:博弈,贪心。一看到以为是博弈,结果直接贪心过了。

           首先,相同形状的方块压缩,一共有8中不同的方块。得到A,B优先级:

           (每次,取自己最优且给对手最大困扰的发难,1只能A拿,2只能B拿,所以最后再用

            A:15 > 5 > 3 > 11 > 7 > 9 > 1; B:15 > 3 > 5 > 11 > 9 > 7 > 2;

           按这个策略贪心模拟即可。

说明:(2011-09-19 01:05)。

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    int t,n[ 16 ];
    while ( cin >> t ) 
    for ( int i = 1 ; i <= t ; ++ i ) {
        for ( int j = 1 ; j <= 15 ; ++ j )
            cin >> n[ j ];
            
        n[ 3 ] += n[ 4 ];    
        n[ 5 ] += n[ 6 ];
        n[ 7 ] += n[ 8 ];
        n[ 9 ] += n[ 10 ];
        n[ 11 ] += n[ 12 ];
        n[ 11 ] += n[ 13 ];
        n[ 11 ] += n[ 14 ]; 
        
        int A = 2*n[ 1 ],B = 2*n[ 2 ];
    //    cout << A << " " << B << endl;
        while ( 1 ) {
    //        cout << "!!!" << endl;
             if ( n[ 15 ] ) {
                A += 2;
                -- n[ 15 ];
            }else if ( n[ 5 ] ) {
                A += 2;
                -- n[ 5 ];
            }else if ( n[ 3 ] ) {
                A += 1;
                -- n[ 3 ];
            }else if ( n[ 11 ] ) {
                A += 1;
                -- n[ 11 ];
            }else if ( n[ 7 ] ) {
                A += 1;
                -- n[ 7 ];
            }else if ( n[ 9 ] ) {
                A += 1;
                B += 1;
                -- n[ 9 ];
            }else break;
            
            if ( n[ 15 ] ) {
                B += 2;
                -- n[ 15 ];
            }else if ( n[ 3 ] ) {
                B += 2;
                -- n[ 3 ];
            }else if ( n[ 5 ] ) {
                B += 1;
                -- n[ 5 ];
            }else if ( n[ 11 ] ) {
                B += 1;
                -- n[ 11 ];
            }else if ( n[ 9 ] ) {
                B += 1;
                -- n[ 9 ];
            }else if ( n[ 7 ] ) {
                A += 1;
                B += 1;
                -- n[ 7 ];
            }else break;
    //        cout << "??" << endl;
        }
        if ( A > B ) 
            cout << "Case #" << i << ": Alice" << endl;
        else cout << "Case #" << i << ": Bob" << endl;
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值