2014新生暑假个人排位赛05 E. 机智的学姐

本文深入探讨了游戏开发领域的核心技术,包括游戏引擎、动画、3D空间视频等关键概念,旨在帮助开发者提升游戏制作能力。
时间限制 1000 ms内存限制 65536 KB

题目描述

斗地主玩法简单,娱乐性强,老少皆宜。据传在万恶的旧社会,地主横行乡里,无恶不做,人们为了发泄对地主的痛恨,常常在一天的劳作之后,一家人关起门来“斗地主”。该游戏由三人玩一副牌,地主为一方,其余两家为另一方,双方对战,先出完手中牌的一方胜。
机智的学姐已经通过某些不和谐的手段,得到了下家手上的牌型,可是学姐的机智值全都用来得到下家牌型了。她非常想知道自己是不是有一种出牌的方法,使得下家没有办法能大过自己,这个艰难的任务就交给你了。(不用判断输赢,只需判断这一轮牌有没有好的策略使下家没法大过自己)
关于牌型比较
火箭:即双王(大王和小王),最大的牌。
炸弹:四张同数值牌(如四个7)。
单牌:单个牌(如一张5)。
对牌:数值相同的两张牌(如一对4)。
三张牌:数值相同的三张牌(如三个J)。
三带一:数值相同的三张牌 + 一张单牌或一对牌。例如:333+6 或 444+99。
单顺:五张或更多的连续单牌(如:45678 或 78910JQK)。不包括 2 点和双王。
双顺:三对或更多的连续对牌(如:334455 、77 88 99 1010 JJ)。不包括 2 点和双王。
三顺:二个或更多的连续三张牌(如:333444 、 555 666 777 888)。不包括 2 点和双王。
飞机带翅膀:三顺+同数量的单牌(或同数量的对牌)。
如: 444555+79 或 333444555+7799JJ。
四带二:四张牌+两手牌(注意:四带二不是炸弹)。
如: 5555+3+8 或 4444+55+77。

关于牌型大小
火箭最大,可以打任意其他的牌。
炸弹比火箭小,比其他牌大。都是炸弹时按牌的分值比大小。
除火箭和炸弹外,其他牌必须要牌型相同且总张数相同才能比大小。相同牌型按牌的分值比大小。
依次是 大王 > 小王 >2>A>K>Q>J>10>9>8>7>6>5>4>3 ,不分花色。

输入格式

为了处理方便,我们用Y表示大王,X表示小王,T表示10。
所有牌都用A23456789TJQKXY表示,两家牌的数量小于20。
每组数据两行,有多组数据,EOF结束。

输出格式

每个测试数据一行Yes或者No

输入样例

A334455
23456789
23456
456789
AJJJ
3333

输出样例

Yes
Yes
No
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<map>
#include<cstring>
#define ll long long
#define N 100
 
using namespace std;
 
int l1,l2,i,j,k,Maxa,Maxb;
map<char,int>pat;
string a,b;
int p1[N],p2[N];
int Comba[N],Combb[N];//记录下连牌时的最大牌的数字
void re(int* q){for(i=0;i<N;i++)q[i]=0;}
void solve(){
    re(Comba);re(Combb);
    for(i=3;i<=17;i++){
        if(p1[i])Comba[p1[i]]=i;
        if(p2[i])Combb[p2[i]]=i;
    }
    if(p1[16]&&p1[17])Comba[4]=17;//双王MAX
    if(p2[16]&&p2[17])Combb[4]=17;
    if(Comba[4]>=Combb[4]&&Comba[4]){printf("Yes\n");return;}//火箭和炸弹
    else if(Comba[4]<Combb[4]){printf("No\n");return;}
    else if(Maxa>=Maxb){printf("Yes\n");return;}//单牌
    else if(Comba[2]>=Combb[2]&&Comba[2]){printf("Yes\n");return;}//对牌
    else if(Comba[3]>=Combb[3]&&Comba[3]){printf("Yes\n");return;}//三张牌
    for(i=3;i<=10;i=j){//单顺
        for(j=i;j<=14;j++)
            if(!p1[j])break;
        if(j-i>=5)Comba[j-i]=j-1;
        while(!p1[j])j++;
    }
    for(i=3;i<=10;i=j){
        for(j=i;j<=14;j++)
            if(!p2[j])break;
        if(j-i>=5)Combb[j-i]=j-1;
        while(!p2[j])j++;
    }
    for(i=12;i>=5;i--)if(Comba[i]>=Combb[i]&&Comba[i]){printf("Yes\n");return;}
    for(i=3;i<=12;i=j){//双顺
        for(j=i;j<=14;j++)
            if(p1[j]<2)break;
        if(j-i>=3)Comba[2*(j-i)+15]=j-1;
        while(p1[j]<2)j++;
    }
    for(i=3;i<=12;i=j){
        for(j=i;j<=14;j++)
            if(p2[j]<2)break;
        if(j-i>=3)Combb[2*(j-i)+15]=j-1;
        while(p2[j]<2)j++;
    }
    for(i=38;i>=21;i--)if(Comba[i]>=Combb[i]&&Comba[i]){printf("Yes\n");return;}
    printf("No\n");
}
int main(){
    ios_base::sync_with_stdio(false);
    pat['3']=3;pat['4']=4;pat['5']=5;pat['6']=6;
    pat['7']=7;pat['8']=8;pat['9']=9;pat['T']=10;
    pat['J']=11;pat['Q']=12;pat['K']=13;pat['A']=14;
    pat['2']=15;pat['X']=16;pat['Y']=17;
    while(cin>>a>>b){
        Maxa=Maxb=0;
        l1=a.size();
        l2=b.size();
        for(i=0;i<l1;i++){
            p1[pat[a[i]]]++;
            if(pat[a[i]]>Maxa)Maxa=pat[a[i]];
        }
        for(i=0;i<l2;i++){
            p2[pat[b[i]]]++;
            if(pat[b[i]]>Maxb)Maxb=pat[b[i]];
        }
        solve();
        re(p1);re(p2);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值