题目
德州扑克的花型由 N 张扑克牌组成 0<N<8,可以组成的牌型按照价值从高到低来区分分别为:
- 皇家同花顺:最高为 Ace (一点)的同花顺。
如 A K Q J 10 的同花顺 - 同花顺:同一花色,五张顺字的牌。
如:K Q J 10 9 的同花顺 - 四条:有四张同一点数的牌。
如:4 4 4 4 9 - 葫芦:三张同一点数的牌。加—对其他点数的牌。
如:3 3 3 10 10 - 同花:五张同一花色的牌。
如:J 10 8 7 5 的全是红桃的牌 - 顺子:五张顺连的牌。
如:5 4 3 2 A 的非同花牌(此牌型为最小的顺子) - 三条:仅有三张同一点数的牌。其余两张点数不同。
如:9 9 9 5 3 - 两对:两张相同点数的牌,加另外两张相同点数的牌。
如:K K 5 5 2 - —对:仅有两张相同点数的牌。
如:10 10 9 4 2 - 高牌:不符合上面任何一种牌型的牌型,由单牌且不连续不同花的组成,以点数决定大小。
如:A 10 9 5 3 的非同花的牌
这十种牌型分别输出 HuangJiaTongHuaShun、TongHuaShun、SiTiao、HuLu、TongHua、Shunzi、SanTiao、LiangDui、YiDui、GaoPai
扑克牌有 4 种花色,分别为(S 表示黑桃,H 表示红心,C 表示草花,D 表示方片)
本题的输入为任意小于 8 的 N 张牌
得到的结果为这些牌中排序最靠前的类型。
输入描述:
2(牌数为 2)
SA HA(两张牌为黑桃 A 红心 A)
输出描述:
YiDui(结果为一对)
样例输入:
5
SA SK SQ SJ S10
样例输出:
HuangJiaTongHuashun
求解
package test;
import java.util.*;
public class Test3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
Map<Character, Integer> map1 = new HashMap<>();
map1.put('S', 0); map1.put('H', 1); map1.put('C', 2); map1.put('D', 3);
Map<String, Integer> map2 = new HashMap<>();
map2.put("J", 10); map2.put("Q", 11); map2.put("K", 12); map2.put("A", 0);
int[][] hd_count = new int[4][13];
int[] h_count = new int[4];
int[] d_count = new int[13];
for(int n = 0; n < N; ++n) {
String s = sc.next();
int i = map1.get(s.charAt(0));
String dian = s.substring(1);
Integer j = map2.get(dian);
if(j == null) j = Integer.valueOf(dian)-1;
hd_count[i][j]++;
h_count[i]++;
d_count[j]++;
}
// HuangjiaTongHuaShun
for(int i = 0; i < 4; ++i) {
int j = 9;
for(; j < 13; ++j) {
if(hd_count[i][j] == 0) break;
}
if(j == 13 && hd_count[i][0] > 0) {
System.out.println("HuangjiaTongHuaShun");
return;
}
}
// TongHuaShun
for(int i = 0; i < 4; ++i) {
int count = 0;
for(int j = 0; j < 13; ++j) {
if(hd_count[i][j] > 0) count++;
else {
if(count >= 5) {
System.out.println("TongHuaShun");
return;
}else count = 0;
}
}
}
Map<Integer, Integer> cmap = new HashMap<>();
for(int i = 0; i < 13; ++i) {
int count = cmap.getOrDefault(d_count[i], 0);
cmap.put(d_count[i], count+1);
}
// SiTiao
if(cmap.containsKey(4)) {
System.out.println("SiTiao");
return;
}
// HuLu
if(cmap.containsKey(3) && cmap.containsKey(2)) {
System.out.println("HuLu");
return;
}
// TongHua
for(int i = 0; i < 4; ++i) {
if(h_count[i] >= 5) {
System.out.println("TongHua");
return;
}
}
// ShunZi
int count = 0;
for(int i = 0; i < 13; ++i) {
if(d_count[i] > 0) count++;
else {
if(count >= 5) {
System.out.println("ShunZi");
return;
}else count = 0;
}
}
// SanTiao
if(cmap.containsKey(3)) {
System.out.println("SanTiao");
return;
}
// LiangDui
if(cmap.get(2) >= 2) {
System.out.println("LiangDui");
return;
}
// YiDui
if(cmap.get(2) == 1) {
System.out.println("YiDui");
return;
}
// GaoPai
System.out.println("GaoPai");
}
}