题目描述
初始有5张牌,每张牌由大小和花色组成,大小由数字2~10、J、Q、K、A,牌的花色有红桃、黑桃、梅花、方块四种。定义6种牌型,判断属于哪种牌型:
- 牌型1:同花顺,同一个花色的顺子,例,红桃2红桃3红桃4红桃5红桃6;
- 牌型2:四条,四张相同数字+单张,例,红桃A黑桃A梅花A方块A+黑桃K;
- 牌型3:葫芦,三张相同数字+一对,例,红桃5黑桃5梅花5+方块9梅花9;
- 牌型4:同花,同一花色,例,方块3方块7方块10方块J方块Q;
- 牌型5:顺子,花色不一样的顺子,例,红桃2黑桃3红桃4红桃5方块6;
- 牌型6:三条,三张相同+两张单。
说明:
- 五张牌里不会出现牌大小和花色完全相同的牌;
- 编号小的牌型较大,如同花顺比四条大,依此类推;
- 包含A的合法的顺子只有10、J、Q、K、A和A、2、3、4、5;类似K、A、2、3、4的序列不认为是顺子。
输入
输入由5行组成,每行为一张牌大小和花色,牌大小为2~10、J、Q、K、A,花色分别用字符H、S、C、D表示红桃、黑桃、梅花、方块。
输出
输出牌型序号,5张牌符合多种牌型时,取最大的牌型序号输出。
用例
题目解析
这道题是一道逻辑题,输入了五张牌,然后我们需要对这五张牌进行六种情况的分
析,并且分析有优先级:
- 是否为同花顺
- 是否为四条
- 是否为葫芦
- 是否同花
- 是否为顺子
- 是否为三条
若满足了前面,则后面的就不需要再判断了。另外,同花顺的情况判断,其实就是同花+顺子,因此在写代码时可以再拆下代码。
Java源码
import java.util.*;
public class DezhouCards {
static HashMap<String, Integer> numCount = new HashMap<>();//统计各个牌的大小的数量
static HashSet<String> colorSet = new HashSet<>();//统计花色种类的数量
static ArrayList<Integer> values;//各个牌大小数量的集合
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 5; i++) {
System.out.println("请输入数字:");
String num = sc.next();//数字
System.out.println("请输入花色:");
String color = sc.next();//花色
numCount.put(num, numCount.getOrDefault(num,0) + 1);//统计各个牌大小的数量
colorSet.add(color);//统计花色种类数量
}
values = new ArrayList<>(numCount.values());//各个牌大小数量的集合
values.sort((a, b) -> b - a);//数量降序
int ans = 0;//牌型
if(isFlush() && isStraights()){//同花顺
ans = 1;
}else if(isFour()){//四条
ans = 2;
}else if(isFullHouse()){//葫芦
ans = 3;
}else if(isFlush()){//同花
ans = 4;
}else if(isStraights()){//顺子
ans = 5;
}else if(isThree()){//三条
ans = 6;
}
System.out.println("牌型为:"+ans);
}
public static int mapToNum(String card){//牌大小映射位数值
switch(card){
case "J":
return 11;
case "Q":
return 12;
case "K":
return 13;
case "A":
return 14;
default:
return Integer.parseInt(card);
}
}
//同花
public static boolean isFlush(){
return colorSet.size() == 1;//所有牌花色一样,同花
}
//顺子
public static boolean isStraights(){
ArrayList<String> list = new ArrayList<>(numCount.keySet());
if(list.size() < 5){//顺子牌不低于5张
return false;
}
list.sort((a, b) -> mapToNum(a) - mapToNum(b));//牌大小升序
StringBuilder sb = new StringBuilder();
list.forEach(sb :: append);
//除了2345A顺子外,其余顺子最大牌值 - 最小牌值都为4
return "2345A".contentEquals(sb) || mapToNum(list.get(list.size() - 1)) - mapToNum(list.get(0)) == 4;
}
//四条
public static boolean isFour(){
return values.size() == 2 && values.get(0) == 4;//四张相同数字+单张
}
//葫芦
public static boolean isFullHouse(){
return values.size() == 2 && values.get(0) == 3;//3张相同数字+一对
}
//三条
public static boolean isThree(){
return values.size() == 3 && values.get(0) == 3;//3张相同数字+2单张
}
}