扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):)
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker JOKER
请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR
基本规则:
(1)输入每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;
(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子)
(3)大小规则跟大家平时了解的常见规则相同,个子,对子,三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;
(4)输入的两手牌不会出现相等的情况。
答案提示:
(1)除了炸弹和对王之外,其他必须同类型比较。
(2)输入已经保证合法性,不用检查输入是否是合法的牌。
(3)输入的顺子已经经过从小到大排序,因此不用再排序了.
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker JOKER
请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR
基本规则:
(1)输入每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;
(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子)
(3)大小规则跟大家平时了解的常见规则相同,个子,对子,三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;
(4)输入的两手牌不会出现相等的情况。
答案提示:
(1)除了炸弹和对王之外,其他必须同类型比较。
(2)输入已经保证合法性,不用检查输入是否是合法的牌。
(3)输入的顺子已经经过从小到大排序,因此不用再排序了.
输入描述:
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如4 4 4 4-joker JOKER。
输出描述:
输出两手牌中较大的那手,不含连接符,扑克牌顺序不变,仍以空格隔开;如果不存在比较关系则输出ERROR。
示例1
输入
4 4 4 4-joker JOKER
输出
joker JOKER
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String line = scanner.nextLine(); String[] towHands = line.trim().split("-"); Poker left = create(towHands[0].trim().split(" ")); Poker right = create(towHands[1].trim().split(" ")); int result = left.compareTo(right); if (result > 0) { System.out.println(left.toString()); } else if (result < 0) { System.out.println(right.toString()); } else { System.out.println("ERROR"); } } } private static Poker create(String[] items) { if (items.length == 1) { return new Single(items[0]); } if (items.length == 2) { if (items[0].equals("joker") || items[0].equals("JOKER")) { return new BigBoom(items); } else { return new Pair(items[0]); } } if (items.length == 3) { return new Three(items[0]); } if (items.length == 4) { return new Boom(items[0]); } if (items.length == 5) { return new Flow(items); } return null; } private enum Type { SINGLE, PAIR, FLOW, THREE, BOOM, BIGBOOM } private interface Poker { Type getType(); int compareTo(Poker poker); } private static class Single implements Poker { private int value; private String name; public Single(String flag) { name = flag; value = Util.jugeValue(flag); } @Override public String toString() { return name; } public int compareTo(Poker poker) { if (poker.getType() == Type.BOOM || poker.getType() == Type.BIGBOOM) { return -1; } if (poker.getType() == Type.SINGLE) { Single other = (Single) poker; return value - other.value; } return 0; } public Type getType() { return Type.SINGLE; } } private static class Pair implements Poker { private int value; private String name; public Pair(String flag) { name = flag; value = Util.jugeValue(flag); } @Override public String toString() { return String.format("%s %s", name, name); } public int compareTo(Poker poker) { if (poker.getType() == Type.BOOM || poker.getType() == Type.BIGBOOM) { return -1; } if (poker.getType() == Type.PAIR) { Pair other = (Pair) poker; return value - other.value; } return 0; } public Type getType() { return Type.PAIR; } } private static class Three implements Poker { private int value; private String name; public Three(String flag) { name = flag; value = Util.jugeValue(flag); } @Override public String toString() { return String.format("%s %s %s", name, name, name); } public int compareTo(Poker poker) { if (poker.getType() == Type.BOOM || poker.getType() == Type.BIGBOOM) { return -1; } if (poker.getType() == Type.THREE) { Three other = (Three) poker; return value - other.value; } return 0; } public Type getType() { return Type.THREE; } } private static class Flow implements Poker { private int value; private String[] names; public Flow(String[] names) { this.names = names; value = Integer.parseInt(names[0]); } public int compareTo(Poker poker) { if (poker.getType() == Type.BOOM || poker.getType() == Type.BIGBOOM) { return -1; } if (poker.getType() == Type.FLOW) { Flow other = (Flow) poker; return value - other.value; } return 0; } @Override public String toString() { return String.join(" ", names); } public Type getType() { return Type.FLOW; } } private static class Util { public static int jugeValue(String flag) { if (flag.equals("JOKER")) { return 17; } else if (flag.equals("joker")) { return 16; } else if (flag.equals("2")) { return 15; } else if (flag.equals("A")) { return 14; } else if (flag.equals("K")) { return 13; } else if (flag.equals("Q")) { return 12; } else if (flag.equals("J")) { return 11; } else { return Integer.parseInt(flag); } } } private static class Boom implements Poker { private int value; private String name; public Boom(String flag) { name = flag; value = Util.jugeValue(flag); } @Override public String toString() { return String.format("%s %s %s %s", name, name, name, name); } public int compareTo(Poker poker) { if (poker.getType() == Type.BIGBOOM) { return -1; } if (poker.getType() == Type.BOOM) { Boom other = (Boom) poker; return value - other.value; } return 1; } public Type getType() { return Type.BOOM; } } private static class BigBoom implements Poker { private String[] names; public BigBoom(String[] names) { this.names = names; } public int compareTo(Poker poker) { return 1; } public Type getType() { return Type.BIGBOOM; } @Override public String toString() { return String.format("%s %s", names[0], names[1]); } } }