斗地主之顺子

题目描述

在斗地主扑克牌游戏中,扑克牌由小到大的顺序为: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

//2 9 J 2 3 4 K A 7 9 A 5 6 =>3 4 5 6 7
//2 9 J 10 3 4 K A 7 Q A 5 6=>3 4 5 6 7 ,9 10 J Q K A
//2 9 9 9 3 4 K A 10 Q A 5 6=>NO
public class 斗地主之顺14 {
    public static void main(String[] args) {
        // 接收数据
        Scanner sc = new Scanner(System.in);
        String[] strings = new String[13];
        for (int i = 0; i < 13; i++) {
            strings[i] = sc.next();
        }
        // 将数据转换为int形式
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 13; i++) {
            int val = getNum(strings[i]);
            if (val != 0){
                list.add(val);
            }
        }
        // 进行排序
        Collections.sort(list);
        // 收集符合要求的顺子
        ArrayList<List<Integer>> res = new ArrayList<>();
        boolean[] used = new boolean[list.size()];
        for (int i = 0; i < list.size(); i++) {
            if (used[i])continue;
            ArrayList<Integer> cur = new ArrayList<>();
            cur.add(list.get(i));
            used[i] = true;

            for (int j = i+1; j < list.size(); j++) {
                if (used[j])continue;
                if (list.get(j) == cur.get(cur.size()-1)+1){
                    cur.add(list.get(j));
                    used[j] = true;
                }else if (list.get(j) > cur.get(cur.size()-1)+1){
                    break;
                }
            }
            if (cur.size() >= 5){
                res.add(cur);
            }else {
                for(Integer a: cur){
                    used[list.indexOf(a)] = false;
                }
            }
        }
        // 按要求输出顺子
        if (res.isEmpty()){
            System.out.println("NO");
        }else {
            for (List<Integer> item: res){
                for (int i = 0; i < item.size(); i++) {
                    if (i > 0) System.out.print(" ");
                    Integer val = item.get(i);
                    if (val == 11){
                        System.out.print("J");
                    }else if (val == 12){
                        System.out.print("Q");
                    }else if (val == 13){
                        System.out.print("K");
                    }else if (val == 14){
                        System.out.print("A");
                    }else {
                        System.out.print(val);
                    }
                }
                System.out.println();
            }
        }
    }

    private static int getNum(String s) {
        switch (s){
            case "3":return 3;
            case "4":return 4;
            case "5":return 5;
            case "6":return 6;
            case "7":return 7;
            case "8":return 8;
            case "9":return 9;
            case "10":return 10;
            case "J":return 11;
            case "Q":return 12;
            case "K":return 13;
            case "A":return 14;
            default:return 0;
        }
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值