华为:干瞪眼

/*
干瞪眼
问题描述:
在成都,流行一种扑克游戏叫“干瞪眼”。使用扑克牌,包括:A(1),2,3,4,5,6,7,8,9,T(10),J(11),Q(12),K(13)。
注意:10用T替换,这里暂时不考虑大鬼和小鬼。
两手牌的大小规则如下:
a) 单牌:4比3大,5比4大,只有两张牌刚好大一点时才能进行比较,比较顺序为:A>K>Q>J>T>9>8>7>6>5>4>3。
比如:6大于5,但是不能比4大,6和4不能比较。单牌2属于特殊牌,他可以和其他所有普通单牌比较,
并且是最大的。
请注意3,他不能大于任何牌。
b) 对子:即两张牌的点数相同,规则和单牌相似,也需要进行类似处理。两个2是特殊对子,
可以大于所有的其他对子。
注意:对子和单牌是不能进行比较的。
c) 炸弹:3个点数相同的牌。炸弹可以大于任何单张和对子,炸弹之间的比较不用像单牌和对子那样,
只能大一点才能比较。
只要满足:222>AAA>KKK>QQQ>JJJ>TTT>…>333的规则的即可。即222是最大的,AAA可以大于KKK,也可以大于333。
d) 其他规则暂不考虑实现
现在请你实现一个程序,自动判断两手牌的大小,注意:输入的牌只会出现3种类型:单张,对子,炸弹。
张数最多3张。
不会出现2个单牌。比如”25”,也不会出现一个对子加单牌,比如”334”等,类似输入异常你可以不用考虑。
但是pFirstCards为单牌,pSecondCards为对子,类似的组合输入是合法的。
要求实现函数:
int CompareCards(char *pFirstCards, char *pSecondCards)
【输入】 char *pFirstCards:需要比较的第一手牌
char *pSecondCards:需要比较的第二手牌
【返回】 int 类型,返回值说明:
如果pFirstCards和 pSecondCards无法比较,比如”3”和”6”;”55”和”6”等,返回0。
如果pFirstCards大于pSecondCards,返回1。
如果pFirstCards等于 pSecondCards,返回2。
如果pFirstCards小于 pSecondCards,返回3。
注意:不用考虑输入的合法性,这个由函数的使用者保证。输入的牌均为字符’1’,’2’..’9’,大写的’A’,’T’,’J’,’Q’,’K’。
示例
输入: “77”、 “33”,返回:0
输入: “77”、 “77”,返回:2
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAX=256;
int CompareCards(char *pFirstCards, char *pSecondCards)
{
    char hash[MAX]={0};
    char table[]="2AKQJT9876543";
    for(int i=0;i<15;i++)
    {
        hash[table[i]]=i;
    }
    int len1=strlen(pFirstCards),len2=strlen(pSecondCards);
    //先考虑有炸弹的情况
    if(len1==3&&len2<3)return 1;
    if(len2==3&&len1<3)return 3;
    if(len1==3&&len2==3)
    {
        if(hash[*pFirstCards]>hash[*pSecondCards])return 3;
        if(hash[*pFirstCards]<hash[*pSecondCards])return 1;
        if(hash[*pFirstCards]==hash[*pSecondCards])return 2;
    }
    //考虑没有炸弹的情况,考虑对子的情况
    if(len1==2&&len2==2)
    {
        if((hash[*pFirstCards]-hash[*pSecondCards])==0)return 2;
        if(hash[*pFirstCards]==0)return 1;
        if(hash[*pSecondCards]==0)return 3;
        if((hash[*pFirstCards]-hash[*pSecondCards])==1)return 3;
        if((hash[*pFirstCards]-hash[*pSecondCards])==-1)return 1;
    }
    //考虑单子的情况
    if(len1==1&&len2==1)
    {
        if((hash[*pFirstCards]-hash[*pSecondCards])==0) return 2;
        if(hash[*pFirstCards]==0)return 1;
        if(hash[*pSecondCards]==0)return 3;
        if((hash[*pFirstCards]-hash[*pSecondCards])==1)return 3;
        if((hash[*pFirstCards]-hash[*pSecondCards])==-1)return 1;
    }
    return 0;
}
int main()
{
    char *p1="777",*p2="777";
    cout<<"CompareCards "<<CompareCards(p1,p2)<<endl;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值