斗地主之顺子 E100

斗地主之顺子 E100

题目描述

在斗地主只扑克牌游戏中,扑克牌由小到大的顺序为:3.4,5.6,7.8,9,10.J,Q.K.A.2,玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。

其中顺子的出牌规则为:由至少5张由小到大连续递增的 扑克牌只 组成,且不能包含2。

例如:(3.4,5,6,7}、(3.4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;而{J,Q,K,A,2}、(2,3,4,5,6}、(3,4,5,6}、(3,4,5.6,8)等都不是顺子给定一个包含 13 张牌的数组,如果有满足出牌规则的顺子,请输出顺子。

如果存在多个顺子,请每行输出一个顺子,且需要按顺子的第一张牌的大小(必须从小到大)依次输出。

如果没有满足出牌规则的顺子,请输出NO。

输入描述

13张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王:2 9 J 2 3 4 K A 7 9 A 5 6不需要考虑输入为异常字符的情况

输出描述

组成的顺子,每张扑克牌数字用空格隔开:3 4 5 6 7

示例1

输入

2 9 J 2 3 4 K A 7 9 A 5 6

输出

3 4 5 6 7

说明

13张牌中,可以组成的顺子只有1组:3 4 5 6 7.

示例2

输入

2 9 J 10 3 4 K A 7 Q A 5 6

输出

3 4 5 6 7

9 10 J Q K A

说明

13张牌中,可以组成2组顺子,从小到大分别为:3 4 5 6 7和9 10 J Q K A

示例3

输入

2 9 9 9 3 4 K A 10 Q A 5 6

输出

NO

说明

13张牌中,无法组成顺子。

题解

读取数据J Q K A →\rightarrow→ 11 12 13 14, 2 直接丢弃对数组排序使用 boolean[] 记录已经使用过的数字的位置使用双循环,尝试每一个开始的数字能否组成顺子

源码 Java

public class DouDiZhu {

// 2 9 J 10 3 4 K A 7 Q A 5 6

static Map map = new HashMap<>();

static {

map.put("3", 3);

map.put("4", 4);

map.put("5", 5);

map.put("6", 6);

map.put("7", 7);

map.put("8", 8);

map.put("9", 9);

map.put("10", 10);

map.put("J", 11);

map.put("Q", 12);

map.put("K", 13);

map.put("A", 14);

}

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

String[] ss = in.nextLine().split(" ");

int[] arr = new int[ss.length];

for (int i = 0; i < ss.length; i++) {

// 这里 2 的元素不会被获取, 使用默认值 0 填充, 不会影响结果

if (map.containsKey(ss[i])) arr[i] = map.get(ss[i]);

}

// 对数组排序,方便后面查找

Arrays.sort(arr);

boolean[] used = new boolean[arr.length];

boolean has = false;

for (int i = 0; i < arr.length - 5; i++) {

List list1 = new ArrayList<>();

for (int j = i ; j < arr.length; j++) {

if (used[j]) continue;

// 第一个元素直接添加

if (list1.isEmpty()) {

list1.add(j);

// 如果下一个元素有可能组成顺子,则添加

} else if (arr[list1.get(list1.size() - 1)] == arr[j] - 1) {

list1.add(j);

}

}

// >= 5 意味着组成了顺子

if (list1.size() >= 5) {

StringBuilder sb = new StringBuilder();

for (int j = 0; j < list1.size(); j++) {

// 标记元素已经使用

Integer i1 = list1.get(j);

used[i1] = true;

sb.append(getRealString(arr[i1]));

}

System.out.println(sb.toString().trim());

has = true;

}

}

if (!has) System.out.println("NO");

}

private static String getRealString(Integer i) {

if (i <= 10) {

return i + " ";

} else {

if (i == 11) return "J ";

if (i == 12) return "Q ";

if (i == 13) return "K ";

if (i == 14) return "A ";

}

return "";

}

}

相关推荐

炸裂!黄圣依不知道自己个人资产有多少
万博365下载

炸裂!黄圣依不知道自己个人资产有多少

📅 07-08 👁️ 6803
利息计算公式年利率,你知道怎么算吗?
365bet客户端下载

利息计算公式年利率,你知道怎么算吗?

📅 06-30 👁️ 3040
好付注册指南,轻松开启便捷支付之旅,好付注册攻略,轻松迈入便捷支付新时代