OJ题目:扑克牌大小

题目描述:

扑克牌游戏大家应该都比较熟悉了,一副牌由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)输入的两手牌不会出现相等的情况。

 
输入:

输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如 4 4 4 4-joker JOKER。

输出:

输出两手牌中较大的那手,不含连接符,扑克牌顺序不变,仍以空格隔开;如果不存在比较关系则输出ERROR。

样例输入:
4 4 4 4-joker JOKER
样例输出:
joker JOKER
答案提示:

(1)除了炸弹和对王之外,其他必须同类型比较。

(2)输入已经保证合法性,不用检查输入是否是合法的牌。

(3)输入的顺子已经经过从小到大排序,因此不用再排序了。

来源: <http://career-oj.huawei.com/exam/ShowSolution?method=SolutionApp&id=2281>

下面是自己实现的代码,感觉有点繁琐。不过现在还没有想到更好的实现方法。

实现代码:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
void setColorCard();
void getCards(const string &src,string &first, string &second);
void yingsheCards(string &src,vector<int> &result);
int compareCards(vector<int> &first,vector<int> &second);
void printError();
void diplay(vector<int> &src);
map<string,int> colorCard;
int main()
{
	fstream in("data.txt");
	string src,f,s;
	int flag = -1;
	vector<int> first,second;
	//设置扑克牌的映射表
	setColorCard();
	getline(in,src);
	getCards(src,f,s);

	yingsheCards(f,first);
	yingsheCards(s,second);
	flag = compareCards(first,second);
	if (flag == 0)
	{
		cout<<f;
	}
	else if (flag == 1)
	{
		cout<<s;
	}
	cout<<endl;
	return 0;
}
void diplay(vector<int> &src)
{
	int i,n;
	n = src.size();
	for (i = 0; i < n; i++)
	{
		cout<<src[i]<<" ";
	}
	cout<<endl;
}
void printError()
{
	cout<<"ERROR"<<endl;
}
void setColorCard()
{
	colorCard["3"] = 3;
	colorCard["4"] = 4;
	colorCard["5"] = 5;
	colorCard["6"] = 6;
	colorCard["7"] = 7;
	colorCard["8"] = 8;
	colorCard["9"] = 9;
	colorCard["10"]= 10;
	colorCard["J"] = 11;
	colorCard["Q"] = 12;
	colorCard["K"] = 13;
	colorCard["A"] = 14;
	colorCard["2"] = 15;
	colorCard["joker"] = 16;
	colorCard["JOKER"] = 17;
}
void getCards(const string &src,string &first, string &second)
{
	 int pos;
	 pos = src.find(‘-‘);
	 if (pos == string::npos)
	 {
		 return;
	 }
	 first = src.substr(0,pos);
	 second= src.substr(pos+1,src.size()-pos);
}
void yingsheCards(string &src,vector<int> &result)
{
	string temp;
	int pos,beg,value;
	int flag = 0;

	beg = 0;
	pos = src.find(‘ ‘,beg);
	while (pos != string::npos)
	{
		temp = src.substr(beg,pos-beg);
		value= colorCard[temp];
		result.push_back(value);
		beg = pos+1;
		pos = src.find(‘ ‘,beg);
		flag = 1;
	}
	temp = src.substr(beg,src.size());
	value= colorCard[temp];
	result.push_back(value);
}
int compareCards(vector<int> &first,vector<int> &second)
{
	int n1,n2;

	//求取两副牌的张数
	n1 = first.size();
	n2 = second.size();

	switch (n1)
	{
	case 1:
		switch(n2)
		{
		case 1:
			if (first[0] > second[0])
			{
				return 0;
			}
			else
			{
				return 1;
			}
		case 2:
			if ((second[0] == 16 && second[1] == 17) || (second[0] == 17)&&(second[1] == 16))
			{
				return 1;
			}
			else
			{
				printError();
			}
			break;
		case 4:
			return 1;
		default:
			printError();
			break;
		}
		break;
	case 2:
		switch(n2)
		{
		//都是对子
		case 2:
			if (first[0] > second[0])
			{
				return 0;
			}
			else
			{
				return 1;
			}
		case 4:
			if ((first[0] == 16 && first[1] == 17) || (first[0] == 17)&&(first[1] == 16))
			{
				return 0;
			}
			else
			{
				return 1;
			}
		default:
			printError();
			break;
		}
		break;
	case 3:
		switch (n2)
		{
		case 2:
			if ((second[0] == 16 && second[1] == 17) || (second[0] == 17)&&(second[1] == 16))
			{
				return 1;
			}
			else
			{
				printError();
			}
			break;
		case 3:
			if (first[0] > second[0])
			{
				return 0;
			}
			else
			{
				return 1;
			}
		case 4:
			return 1;
		default:
			printError();
			break;
		}
		break;
	case 4:
		switch (n2)
		{
		case 2:
			if ((second[0] == 16 && second[1] == 17) || (second[0] == 17)&&(second[1] == 16))
			{
				return 1;
			}
			else
			{
				printError();
			}
			break;
		case 4:
			if (first[0] > second[0])
			{
				return 0;
			}
			else
			{
				return 1;
			}
		default:
			return 0;
		}
		break;
	case 5:
		switch (n2)
		{
		case 2:
			if ((second[0] == 16 && second[1] == 17) || (second[0] == 17)&&(second[1] == 16))
			{
				return 1;
			}
			else
			{
				printError();
			}
			break;
		case 4:
			return 1;
		case 5:
			if (first[4] > second[4])
			{
				return 0;
			}
			else
			{
				return 1;
			}
		default:
			printError();
		}
		break;
	}

	return -1;
}

  

OJ题目:扑克牌大小

时间: 2024-08-24 16:19:59

OJ题目:扑克牌大小的相关文章

华为OJ题目

题目描述: 新入职华为的小伙伴们都有在oj上面刷题的任务,共需要刷100道初级题,45道中级题,5道高级题,其中,做出来的高级题如果超标可以当初级或者中级题,做出来的中级题如果超标可以当初级题.每天,出题的大哥会给大家出Xi道题,这Xi道题属于同一个难度级别,小伙伴们要么用一天时间把这些题全做出来,要么就不做.现在,给你每天出题大哥出的题数以及难度,请问,小伙伴们最少要挑选其中几天去做题,才能把这150道题的任务完成呢? 输入示例: 5 100 70 5 5 55 1 2 2 2 3 输出: 2

九度oj 题目1546:迷宫问题 (概率dp guess消元)

题目链接:点击打开链接 题目描述: 给定一个n*m的迷宫,如 S.. ..# E.E 其中,S代表开始位置,#代表不可行走的墙,E代表出口. 主人公从开始位置出发,每次等概率的随机选择下一个可以行走的位置,直到到达某一个出口为止. 现在他想知道,在这一概率事件中,它从开始位置走到某一个出口的期望步数是多少. 输入: 输入包含多组测试用例,每组测试用例由两个整数n,m(1<=n,m<=15)开始,代表迷宫的大小 接下去n行每行m个字符描述迷宫信息,具体规则如题面所述. 数据保证至少存在一个E和一

以另一种位图的思想来解决一道OJ题目

前言: 以前所接触到的位图的思想都是以1位的形式去存储某个数出现的次数是1次还是0次.常见的例子不外乎在<编程珠玑>上的开篇例子里,1千万个数的排序统计,用1.25M的内存空间就可以达到遍历一遍输入数据而排序好的目的.这种思想是通用的么?也就是说,假如输入数据不再是0次或者1次,而是2次或者更多的时候,如何再次用上这种思想呢?请看下面题目 题目: 输入一个数组,数组有int类型整数若干,若有其中一个是出现一次或者两次,其他数字都是出现3次,要求在时间复杂度在O(N)上限里求出那个数字. 解法一

九度oj 题目1007:奥运排序问题

九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1. 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万). 接下来一行给出M个国家号. 输出:                        排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

各大oj题目分类

PythonTip 在线编程 挑战python 博文 模式 问答 ACM 课堂 下载 吐槽 放松 About 搜索 欢迎您:SSYYGAM | 个人中心| 注销 ACM/ICPC专栏 各大OJ近期比赛列表 各大OJ题目分类 负责任的OJ搜索 POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006POJ1008POJ1013POJ1016POJ1017POJ1169POJ1298POJ13

17周 oj 比較大小 类模板

/*声明一个类模板,利用它分别实现两个整数. 浮点数和字符的比較,求出大数和小数. 说明:在类模板外定义各成员函数. 输入两个整数.两个浮点数和两个字符 从大到小输出两个整数.两个浮点数和两个字符 */ #include <iostream> #include <iomanip> using namespace std; template<class numtype> class Compare { public: Compare(numtype a,numtype b

java OJ题目判断输入结束(与C语言的EOF结束等价)

/* * java 作Oj题目是会有输入若干数据的情况,不好判断输入结束符, * 类似于C语言中的EOF符号 * 在这里提供了一种方法 * */ 1 import java.util.Iterator; 2 import java.util.Scanner; 3 import java.util.TreeSet; 4 5 public class StudentCode { 6 7 public static void main(String[] args) { 8 TreeSet<Intege

九度oj 题目1349:数字在排序数组中出现的次数

题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每个元素均为int. 第三行有1个整数m,表示接下来有m次查询.1<=m<=10^3. 下面有m行,每行有一个整数k,表示要查询的数. 输出: 对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数. 样例输入: 8 1 2 3 3 3 3 4 5 1 3 样例输出: 4 使用库函数即可解决