HDU 4023--Game(贪心+博弈)

本文介绍了一道结合贪心、模拟与博弈策略的算法题目。通过分类不同形状的图形并制定轮流放置规则,来判断最终胜者。文章提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:http://acm.hdu.edu.cn/showproblem.php?pid=4023

/*
题意:Alice有一种1*2的瓷砖,Bob分别有一种2*1的瓷砖,现在有15种形状的图形,
Alice和Bob轮流在上面放瓷砖,谁不能放,谁就输。
分析:是一个贪心+模拟+博弈的题,根据图形来看,可把图形分类为
(1)、(2)、(3,4)、(5,6)、(7,8)、(9,10)、(11,12,13,14)、(15)这几类。
其中(1)肯定是Alice的,(2)他不能选,剩下的选择优先顺序应该是
(15)、(5,6)、(3,4)、(15)、(11,12,13,14)、(7,8)、(9,10);
其中(2)肯定是Bob的,(1)他不能选,剩下的选择优先顺序应该是
(15)、(3,4)、(5,6)、(15)、(11,12,13,14)、(9,10)、(7,8);
然后直接模拟,计算谁先不能走谁就输了。
*/


#include <iostream>
#include <cstdio>
using namespace std;
int a[26];
int alice,bob;
bool v1()
{
    if (a[15]!=0){a[15]--;alice++;return 1;}
    if (a[5]!=0){a[5]--;alice++;return 1;}
    if (a[6]!=0){a[6]--;alice++;return 1;}
    if (a[3]!=0){a[3]--;return 1;}
    if (a[4]!=0){a[4]--;return 1;}
    if (a[11]!=0){a[11]--;return 1;}
    if (a[12]!=0){a[12]--;return 1;}
    if (a[13]!=0){a[13]--;return 1;}
    if (a[14]!=0){a[14]--;return 1;}
    if (a[7]!=0){a[7]--;return 1;}
    if (a[8]!=0){a[8]--;return 1;}
    if (a[9]!=0){a[9]--;bob++;return 1;}
    if (a[10]!=0){a[10]--;bob++;return 1;}
    if (alice!=0){alice--;return 1;}
    return 0;
}
bool v2()
{
    if (a[15]!=0){a[15]--;bob++;return 1;}
    if (a[3]!=0){a[3]--;bob++;return 1;}
    if (a[4]!=0){a[4]--;bob++;return 1;}
    if (a[5]!=0){a[5]--;return 1;}
    if (a[6]!=0){a[6]--;return 1;}
    if (a[11]!=0){a[11]--;return 1;}
    if (a[12]!=0){a[12]--;return 1;}
    if (a[13]!=0){a[13]--;return 1;}
    if (a[14]!=0){a[14]--;return 1;}
    if (a[9]!=0){a[9]--;return 1;}
    if (a[10]!=0){a[10]--;return 1;}
    if (a[7]!=0){a[7]--;alice++;return 1;}
    if (a[8]!=0){a[8]--;alice++;return 1;}
    if (bob!=0){bob--;return 1;}
    return 0;
}
int main()
{
    int T,an=1;
    scanf ("%d",&T);
    while (T--)
    {
        for (int i=1;i<=15;i++)
            scanf ("%d",&a[i]);
        alice = a[1]*2;
        bob = a[2]*2;
        bool f=1;
        while (1)
        {
            if (!v1()){f=0;break;}
            if (!v2())break;
        }
        printf ("Case #%d: ",an++);
        if (!f)printf("Bob\n");
        else printf ("Alice\n");
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值