描述
西斯皇帝欺骗了议员,控制了议会。绝地武士传人Dastan为了正义,与西斯决斗。然而,西斯的天眼看出Dastan是个投机主义者。于是,西斯告诉Dastan,如果决斗的话会伤害的无辜的人,不如玩一把showhand,输的人将被流放。
ShowHand是一项紧张刺激的赌博游戏(香港赌神、赌侠系列中最常见的赌博方式)。以五张牌的排列、组合决定胜负。游戏开始时,每名玩家会获发一张底牌(此牌只能在最后才翻开);当派发第二张牌后,便由牌面较佳者决定下注额,其他人有权选择「跟」、「加注」、「放弃」或「晒冷」。当五张牌派发完毕后,各玩家翻开所有底牌来比较。
花式说明
黑桃♤>红心♥>方片◇>梅花♣
牌面说明
一共52张牌,23456789TJQKA 13张牌每种花式一套。 (T代表10)
A>K>Q>J>T>9>8>7>6>5>4>3>2
牌型说明
如果没有特殊说明,一般情况下同样的牌型比较最大的那张牌的大小,大小相同则比最大的那张牌的花式。牌型由大到小依次如下(有兴趣的同学可以验证一下概率)。
No.1同花顺 拥有五张连续性同花色的顺子。以A为首的同花顺(TJQKA)最大。但JQKA2,QKA23,KA234不算顺子。A2345是最小的同花顺。
No.2铁支 四张相同数字的牌,外加一单张。比数字大小,「A」铁支(AAAA)最大
No.3葫芦 由「三条」加一个「对子」所组成的牌,若别家也有此牌型,则比三条数字大小
No.4同花 不构成顺子的五张同花色的牌。先比数字最大的单张,如相同再比第二支、依此类推,如果5张牌大小都相同,那么比它们的花色。
No.5顺子 五张连续数字的牌组。 以A为首的顺子最大,如果大家都是顺子,比最大的一张牌,如果大小还一样就比这张牌的花式(JQKA2,QKA23,KA234不算顺子).
No.6三条 牌型由三张相同的牌组成,以A为首的三条(AAA)最大
No.7二对 牌型中五张牌由两组两张同数字的牌所组成。若遇相同则先比这副牌中最大的一对,如又相同再比第二对,如果还是一样,比大对子中的最大花式
No.8对子 牌型由两张相同的牌加上三张单张所组成。如果大家都是对子,比对子的大小,如果对子也一样,比这个对子中的最大花色
No.9散牌 单一型态的五张散牌所组成,不成对(二对),不成三条,不成顺(同花顺),不成同花,不成葫芦,不成铁支。先比最大一张牌的大小,如果大小一样,比这张牌的花色。
多组测试数据。每组输入第一行是一个整数T 代表输入组数。每组输入一行,每行描述5张扑克,每个描述由一个字符(2-9,TJQKA)和一个数字(0-4分别代表黑桃,红桃,方片,梅花)组成。每个字符或数字用一个空格隔开。 输出
每组数据,请输出牌型所对应的编号。
Sample Input
4
A 3 Q 3 T 3 K 3 J 3
K 0 K 1 K 2 K 3 A 0
T 0 9 1 T 3 9 3 3 3
K 0 A 1 2 2 3 1 4 1
Sample Output
1
2
7
9
分析
按照描述一步一步写程序,可能会涉及排序和查找.
参考代码
/*
* Title :...
* From :...
* Time :...
* Author :Eric Zhou,binfeihan
* Email :binfeihan@126.com
* Blog :http://blog.csdn.net/binfeihan
*/
import java.util.*;
class Card{
public char point;
public int value;
};
public class Main {
final public static int CN = 5;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cases = sc.nextInt();
Card card[] = new Card[CN];
sc.nextLine();
while(cases > 0){
String s = sc.nextLine();
String sd[] = s.split(" ");
for(int i = 0;i < CN;++ i){
card[i] = new Card();
int j = i * 2;
card[i].point = sd[j].charAt(0);
switch(card[i].point){
case 'T':
card[i].point = '9' + 1;
break;
case 'J':
card[i].point = '9' + 2;
break;
case 'Q':
card[i].point = '9' + 3;
break;
case 'K':
card[i].point = '9' + 4;
break;
case 'A':
card[i].point = '9' + 5;
break;
default:
break;
}
card[i].value = sd[j + 1].charAt(0) - '0';
}
System.out.println(check(card));
cases --;
}
}
private static int check(Card[] card) {
int i,j;
boolean samecolored = true;
boolean sorted = true;
boolean foured = true;
boolean threed = true;
int doubled = 0;
int kind = 1;
//check color
int color = card[0].value;
for(i = 0;i < CN;++ i){
if(card[i].value != color){
samecolored= false;
break;
}
}
//check sequence
Card temp;
boolean bl = true;
for(i = 1;i < CN;++ i){
for(j = 0;j < CN - i;++ j){
bl = true;
if(card[j].point > card[j + 1].point){
temp = card[j];
card[j] = card[j + 1];
card[j + 1] = temp;
bl = false;
}
}
if(bl){
break;
}
}
for(i = 0;i < CN - 1;++ i){
if(card[i].point + 1 != card[i+ 1].point){
sorted = false;
break;
}
}
//check 'A1234'
if(!sorted){
sorted = true;
for(i = 0;i < CN - 2;++ i){
if(card[i].point + 1 != card[i+ 1].point){
sorted = false;
break;
}
}
if(sorted){
if(card[0].point == '2' && card[4].point == ('9' + 5)){
sorted = true;
}else{
sorted = false;
}
}
}
//kind = 1
if(samecolored && sorted){
return kind;
}
kind ++;
//check four same point cards
for(i = 0;i < CN - 2;++ i){
if(card[i].point != card[i + 1].point){
foured = false;
break;
}
}
if(!foured){
for(i = 1;i < CN - 1;++ i){
if(card[i].point != card[i + 1].point){
foured = false;
break;
}
}
}
//kind = 2
if(foured){
return kind;
}
kind ++;
int cdlist[] = new int[13];
for(i = 0;i < 13; ++ i){
cdlist[i] = 0;
}
for(i = 0;i < CN;++ i){
cdlist[card[i].point - '2'] ++;
}
threed = false;
for(i = 0;i < 13;++ i){
if(cdlist[i] == 3){
threed = true;
}
if(cdlist[i] == 2){
doubled ++;
}
}
//kind = 3
if(threed && doubled == 1){
return kind;
}
kind ++;
//kind = 4
if(samecolored){
return kind;
}
kind ++;
//kind = 5
if(sorted){
return kind;
}
kind ++;
//kind = 6
if(threed){
return kind;
}
kind ++;
//kind = 7
if(doubled == 2){
return kind;
}
kind ++;
//kind = 8
if(doubled == 1){
return kind;
}
kind ++;
//kind = 9
return kind;
}
}