算法题 牌型判断 Java

该博客介绍了一个用于识别德州扑克牌型的Java程序。程序通过读取输入的扑克牌,判断出最高牌型并输出结果,包括皇家同花顺、同花顺、四条、葫芦、同花、顺子、三条、两对、一对和高牌。程序首先统计各种花色和点数的出现次数,然后依次检查各牌型条件,一旦满足即输出对应牌型并结束判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

德州扑克的花型由 N 张扑克牌组成 0<N<8,可以组成的牌型按照价值从高到低来区分分别为:

  1. 皇家同花顺:最高为 Ace (一点)的同花顺。
    如 A K Q J 10 的同花顺
  2. 同花顺:同一花色,五张顺字的牌。
    如:K Q J 10 9 的同花顺
  3. 四条:有四张同一点数的牌。
    如:4 4 4 4 9
  4. 葫芦:三张同一点数的牌。加—对其他点数的牌。
    如:3 3 3 10 10
  5. 同花:五张同一花色的牌。
    如:J 10 8 7 5 的全是红桃的牌
  6. 顺子:五张顺连的牌。
    如:5 4 3 2 A 的非同花牌(此牌型为最小的顺子)
  7. 三条:仅有三张同一点数的牌。其余两张点数不同。
    如:9 9 9 5 3
  8. 两对:两张相同点数的牌,加另外两张相同点数的牌。
    如:K K 5 5 2
  9. —对:仅有两张相同点数的牌。
    如:10 10 9 4 2
  10. 高牌:不符合上面任何一种牌型的牌型,由单牌且不连续不同花的组成,以点数决定大小。
    如: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");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值