/*扑克牌游戏大家应该都比較熟悉了。一副牌由54张组成,含3~A、2各4张,小王1张。大王1张。牌面从小到大用例如以下字符和字符串表示(当中。小写joker表示小王,大写JOKER表示大王):
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
输入两手牌。两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER。
请比較两手牌大小,输出较大的牌,假设不存在比較关系则输出ERROR。

基本规则:
(1)输入每手牌可能是个子、对子、顺子(连续5张)、三个、炸弹(四个)和对王中的一种,不存在其它情况,由输入保证两手牌都是合法的。顺子已经从小到大排列;
(2)除了炸弹和对王能够和全部牌比較之外,其它类型的牌仅仅能跟同样类型的存在比較关系(如,对子跟对子比較,三个跟三个比較),不考虑拆牌情况(如:将对子拆分成个子);
(3)大小规则跟大家平时了解的常见规则同样,个子、对子、三个比較牌面大小;顺子比較最小牌大小;炸弹大于前面全部的牌。炸弹之间比較牌面大小。对王是最大的牌;
(4)输入的两手牌不会出现相等的情况。

答案提示:
(1)除了炸弹和对王之外,其它必须同类型比較。
(2)输入已经保证合法性。不用检查输入是否是合法的牌。
(3)输入的顺子已经经过从小到大排序,因此不用再排序了。

#include<iostream>
#include<string>
using namespace std;

int main()
{
     char value[13]={'3','4','5','6','7','8','9','10','J','Q','K','A','2'};    
     string s;
     getline(cin,s);
     int i,j,k,w;
     int type1,type2;// 1 个 2 对 3:三个 4:炸弹 5:顺子 6:个王 7:对王
     for(i=0;i<s.size();i++) //计算输入的 两副牌的类型
     {
          if(s[i]=='-')
          {
               if(i==1)
                    type1=1;
               else if(s[1]!=' ')  //s[1]不等于空格就是王
               {
                    if(i==11)
                         type1=7;   //这样的情况样例:joker JOKER-1 2 3 4 5
                    else
                         type1=6;
               }
               else if(i==3)
                    type1=2;
               else if(i==5)
                    type1=3;
               else if(i==7)
                    type1=4;
               else
                    type1=5;
               break;
          }
     }
    
     j=i;
    
     if(s.size()==j+2)
          type2=1;
     else if(s[j+2]!=' ')    //s[1]不等于空格就是王
     {
          if(s.size()-j-1==11)
               type2=7;       //这样的情况样例:1 2 3 4 5-joker JOKER
          else
               type2=6;
     }
     else if(s.size()-j-1==3)
          type2=2;
     else if(s.size()-j-1==5)
          type2=3;
     else if(s.size()-j-1==7)
          type2=4;
     else
          type2=5;    
    
     if(type1==type2)   //假设类型同样
     {
          if(type1==6 && type2==6)
               if(s[0]=='J')
                    for(w=0;w<j;w++)
                         cout<<s[w];
                    else
                         for(w=j+1;w<s.size();w++)
                              cout<<s[w];    
                         else
                         {
                              for(i=0;i<13;i++)  //通过索引表 比較两副牌第一张牌的大小
                                   if(s[0]==value[i])
                                        break;

                                   for(k=0;k<13;k++)
                                        if(s[j+1]==value[k])
                                             break;
                                       
                                        if(i>k)
                                             for(w=0;w<j;w++)
                                                  cout<<s[w];
                                             else
                                                  for(w=j+1;w<s.size();w++)
                                                       cout<<s[w];                   
                         }
     }
     else
     {
          if(type1==6)   //单张牌假设是王  单独处理
               for(w=0;w<j;w++)
                    cout<<s[w];
               else if(type2==6)
                    for(w=j+1;w<s.size();w++)
                         cout<<s[w];    
                   
                    else if(type1==4)
                    {
                         if(type2==7)
                              for(w=j+1;w<s.size();w++)
                                   cout<<s[w];    
                              else
                                   for(w=0;w<j;w++)
                                        cout<<s[w];
                    }
                    else if(type1==7)
                    {
                         for(w=0;w<j;w++)
                              cout<<s[w];    
                    }

                    else if(type2==4 || type2==7)
                         for(w=j+1;w<s.size();w++)
                              cout<<s[w];    
                         else
                              cout<<"ERROR";
     }
     cout<<endl;
     //     cout<<type1<<"     "<<type2<<endl;
     return 0;
}

/*///////////////////////////測试用例/////////
A 2 3 4 5-2 3 4 5 6
5-8 8
5 5 5-8 8 8
4 4 4 4-5 5 5 5
A A A A-2 2 2 2
8-2
8-8 8 8 8
8 8 8 8-joker JOKER
9-joker JOKER
9-joker
joker-JOKER
4 4 4 4-joker JOKER
joker JOKER-A 2 3 4 5
*/

扑克牌游戏-华为OJ-C++实现的更多相关文章

  1. 华为OJ题目:扑克牌大小

    题目描述: 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A.2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):3  ...

  2. JAVA collection集合之 扑克牌游戏

    主要内容:这里使用collection集合,模拟香港电影中大佬们玩的扑克牌游戏. 1.游戏规则:两个玩家每人手中发两张牌,进行比较.比较每个玩家手中牌最大的点数,大小由A-2,点数大者获胜.如果点数相 ...

  3. 华为OJ:火车进站

    火车进站 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号. 输入描述: 有多组测试用例, ...

  4. 在华为oj的两个月

    一次偶然的机会,我接触到华为oj平台(http://career-oj.huawei.com/exam/camLogin.jsp),当时的心情很是兴奋,于是立马注册开通,然后迫不及待地上去做题.刚开始 ...

  5. 【Nodejs】“快算24”扑克牌游戏算法 1.02

    快算24是一种挺好的锻炼孩子算数能力的扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过有限四则运算得到结果24,四张牌必须仅用一次.各地玩法还有点差别,有的只算1-10,其它抽出来:有的地方把整幅牌都 ...

  6. 【Nodejs】“快算24”扑克牌游戏算法

    算24是一款扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过四则运算得到结果24,四张牌必须仅用一次.这是一种挺好的锻炼孩子算数能力的扑克牌游戏. 各地玩法还有点差别,有的只算1-10,其它抽出来:有 ...

  7. 测开之路四十九:用Django实现扑克牌游戏

    用Django实现和之前flask一样的扑克牌游戏 项目结构 html <!DOCTYPE html><html lang="en"><head> ...

  8. python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (二)

    Hey! 如果你还没有看这篇的上文的话,可以去稍稍瞅一眼,会帮助加速理解这一篇里面涉及到的递归结构哦!(上一篇点这里:<python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)> ...

  9. 华为OJ平台——24点游戏

    题目描述: 给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利 输入: 4个1-10的数字.[数字允许重复,测试用例保证无异常数字]输出: true or false 思路:

随机推荐

  1. 记录解决phpStudy报出403Forbidden问题的方法

    本人输入ip地址+目录去访问PHPTutorial/WWW目录下的某个文件,发生了没有权限访问的问题,导了一个下午,终于解决……不忘在此做个记录 1. 打开phpStudy,点击按键“其他选项菜单”= ...

  2. spring cloud zuul 传递 header

    最近在做一个项目时,发现在网关中调用和在子系统中调用request.getRequestURL()所得到的请求url是不一样的,在网关中得到的是通过域名访问的地址,而在子系统中得到的是网关发起的子系统 ...

  3. ubuntu16.04LTS更换阿里源

    ubuntu16.04LTS更换阿里源 sudo gedit /etc/apt/sources.list 替换:    # deb cdrom:[Ubuntu 16.04 LTS _Xenial Xe ...

  4. httpclient请求服务的各种方法实例

    <!--话不多说,直接上代码--> import com.csis.ConfigManagerimport com.csis.io.web.DefaultConfigItemimport ...

  5. 【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例

    Java中普通代码块,构造代码块,静态代码块区别及代码示例.Java中普通代码块,构造代码块,静态代码块区别及代码示例 执行顺序:静态代码块>静态方法(main方法)>构造代码块>构 ...

  6. objectLiteral.js

    // 1.任意参数的加法运算 function add(){ var sum = 0 for(var i=0;i<arguments.length;i++){ if(!isNaN(argumen ...

  7. python中传值和传地址问题

    在python中,还没有对这个知识点有一个详细的定义,很模糊的说明了,通过下面代码,可以观察出来,什么时候传的是值,什么时候传的是地址 有时候会发现自己的数据发生变化,可能就是这个原因,python的 ...

  8. 二层协议--STP协议总结

    生成树协议的技术实现与配置注意点 一.stp协议的用途 二.stp协议的运行机制 三.stp协议规范

  9. 《Inside C#》笔记(五) 方法

    方法用来体现类的行为. 一 相关概念 a) ref和out 通常一个方法只能返回一个值,但如果确实需要返回多个值时,可以使用ref或out.如果方法的参数被标注为ref或out,在调用该方法时,会传递 ...

  10. Vue父组件接收不到子组件$emit事件的原因分析

    通常有两种情况: 事件名称不全是小写.事件名称要求全小写. 不是父子关系.这里的父子关系是严格的父子关系,祖孙关系也不行.只能一层一层触发,这在写树形组件时,很容易掉坑里.