首页 > 代码库 > hdu 4023 - Game

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;
}

hdu 4023 - Game