hdu 4930 Fighting the Landlords(多校6 1010)

本文介绍了一种斗地主牌局模拟算法,通过分析玩家手牌来判断是否能一次性出完牌或出一手对手无法压制的牌。算法考虑了不同牌型组合及其优先级,并实现了具体的代码实现。

题目链接:点击打开链接


题意:斗地主,给出你和对方的牌,看你能不能一次出完或者出一首对方压不了的牌。

模拟题,记录1,2,3,4张最大的是什么,一共有多少种。注意判断顺序应是一次出完--》对方有炸且比我大--》对方压不住我的牌

比赛是第二层没写好,wa了n次。


代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int input(char t){
            int a;
            if(t=='T')
              a=10;
            else if(t=='Y')
              a=200;
            else if(t=='X')
              a=100;
            else if(t=='2')
              a=20;
            else if(t=='A')
              a=15;
            else if(t=='K')
              a=13;
            else if(t=='Q')
              a=12;
            else if(t=='J')
              a=11;
            else a=t-'0';
            return a;
}
int a[30];
int b[30];
int amax[5],bmax[5];
int anum[5],bnum[5];
int num1,num2;
void init(){
    for(int i=0;i<=4;i++){
        amax[i]=bmax[i]=anum[i]=bnum[i]=0;
    }
}
bool solve(){
    if(anum[4]==1&&!anum[3]&&((anum[2]==1&&!anum[1])||(!anum[2]&&anum[1]==2))){
         return 1;
    }
    if(!anum[4]&&anum[3]==1&&(anum[2]+anum[1])==1){
        return 1;
    }
    if(anum[4]==1&&!anum[3]&&!anum[1]&&!anum[2])
        return 1;
    if(!anum[4]&&anum[3]==1&&!anum[1]&&!anum[2])
        return 1;

    if(!anum[4]&&!anum[3]&&!anum[1]&&anum[2]==1)
        return 1;
    if(!anum[4]&&!anum[3]&&!anum[2]&&anum[1]==1)
        return 1;
    if(a[num1-1]==200&&a[num1-2]==100){
        return 1;
    }
    if(b[num2-1]==200&&b[num2-2]==100){
        return 0;
    }
    if(anum[4]&&amax[4]>=bmax[4])
        return 1;
    if(bnum[4])
        return 0;
    if(amax[1]&&amax[1]>=bmax[1]){
        return 1;
    }
    if(amax[2]&&amax[2]>=bmax[2])
        return 1;
    if(amax[3]&&amax[3]>=bmax[3]){
        return 1;
    }
    if(anum[3]&&anum[1]&&!(bnum[4]||bnum[3]>=2||bnum[2]||bnum[1])){
        return 1;
    }
    if(anum[3]&&anum[2]&&!(bnum[4]||bnum[3]>=2||bnum[2])){
        return 1;
    }
    return 0;
}
int main(){
    int T;
    cin>>T;
    while(T--){
        char t[30];
        cin>>t;
        for(int i=0;i<strlen(t);i++){
            a[i]=input(t[i]);
        }
        num1=strlen(t);
        cin>>t;
        for(int i=0;i<strlen(t);i++){
            b[i]=input(t[i]);
        }
        num2=strlen(t);
        init();
        sort(a,a+num1);
        sort(b,b+num2);
        int k=1;
        int cur=a[0];

        for(int i=1;i<num1;i++){
            amax[k]=cur;
            if(a[i]==cur){
                k++;
            }
            else{
                anum[k]++;
                k=1;
                cur=a[i];
            }
        }
        amax[k]=cur;
        anum[k]++;
        k=1;cur=b[0];
        for(int i=1;i<num2;i++){
            bmax[k]=cur;
            if(b[i]==cur){
                k++;
            }
            else{
                bnum[k]++;
                k=1;
                cur=b[i];
            }
        }
        bnum[k]++;
        bmax[k]=cur;
        if(solve()){
            cout<<"Yes"<<endl;
        }
        else
            cout<<"No"<<endl;
    }
    return 0;
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值