扑克牌游戏-华为OJ-C++实现

/*扑克牌游戏大家应该都比较熟悉了,一副牌由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++实现

时间: 2024-10-28 19:28:11

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

华为OJ训练题之 比赛情况统计

题目如下: 比赛情况统计 有一个游戏平台,各个参赛队伍(以唯一的TeamID来标识)之间进行单循环的对抗赛,两个队伍之间只举行一场比赛,比赛以得分的多少定胜负.需要完成一个统计赛况的程序,能够随时查询指定队伍的最新赛况:包括胜.平.负的局数,当前总积分以及名次. 说明:循环赛没有全部结束时也可以查询某个队伍的最新赛况 规则说明 比赛判定:两个队伍中得分高的一方为胜者,另一方为负者:得分相同则为平局 积分规则:每一局比赛: 胜者积3分;平局双方各积1分; 负者积0分 排名规则:按照当前总积分的高低

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

华为OJ:汽水瓶

题目有点像小学数学题,因为三个空瓶可以换一瓶汽水,但喝完一瓶汽水就可以得到一个空瓶.所以相当于两个空瓶就可以换到一瓶汽水. 把输入除以2即可.这里讲一下java多出入,可以用in.hasNext(),就相当于C/C++里面的while(scanf("%d",n)!=EOF). import java.util.Scanner; public class qishuiping { public static void main(String args[]){ Scanner input=

华为OJ:分段排序

题目有点绕,一个是要二分,用三个字符串,存前,中,后三个,前,后部分都降序排序,然后后半部分再反转一下,讲三部分合起来就好了. import java.util.Scanner; public class dividesort { public static void sort(StringBuffer s){ for(int i=0;i<s.length();i++){ for(int j=i;j<s.length();j++){ if(s.charAt(i)>s.charAt(j))

华为OJ:2290 字符串最后一个单词的长度

用JAVA就很简单,只要用spilt函数,再输出最后一个字符串. 题意是要求你先自己写分隔好字符串这样子.有个比较坑的地方就是测试用例应该有个全为空的,要注意. import java.util.Scanner; public class Main { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); String ss[]=s.spli

华为OJ: 公共字串计算

有几个需要注意的地方,一个这道题是不区分大小写的,所以在计算之前对输入的字符串要做小写或者大写的转换. 第二个,思路一定要清晰,先将s1从[i]处开始与s2的[j]开始匹配,不相等则j++直到j等于s2.length()-1,相等,则i++,j++.注意,这里就是i++,即下次重新开始从s[i]开始匹配时,两次i之间的距离可能会超过1.再j那里设置一个计数器计数即可. import java.util.Scanner; public class findMaxSubStringLength {

【华为OJ】【044-超长正整数相加】

[华为OJ][算法总篇章] [华为OJ][044-超长正整数相加] [工程下载] 题目描述 请设计一个算法完成两个超长正整数的加法. 接口说明 /** * 请设计一个算法完成两个超长正整数的加法. * 输入参数: * String addend:加数 * String augend:被加数 * 返回值:加法结果 */ public String addLongInteger(String addend, String augend) { /*在这里实现功能*/ return null; } 输入

【华为OJ】【094-多线程】

[华为OJ][算法总篇章] [华为OJ][094-多线程] [工程下载] 题目描述 问题描述:有4个线程和1个公共的字符数组.线程1的功能就是向数组输出A,线程2的功能就是向字符输出B, 线程3的功能就是向数组输出C,线程4的功能就是向数组输出D.要求按顺序向数组赋值ABCDABCDABCD, ABCD的个数由线程函数1的参数指定. 输入描述: 输入一个int整数 输出描述: 输出多个ABCD 输入例子: 10 输出例子: ABCDABCDABCDABCDABCDABCDABCDABCDABCD

【华为OJ】【092-学英语】

[华为OJ][算法总篇章] [华为OJ][092-学英语] [工程下载] 题目描述 Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文: 如22:twenty two,123:one hundred and twenty three. 说明 数字为正整数,长度不超过十位,不考虑小数,转化结果为英文小写: 输出格式为twenty two: 非法数据请返回"error": 关键字提示:and,billion,million,thousand,hundred. 方法原型:pu