Open yooocen opened 6 years ago
说起麻将,那可是川渝市民的最爱,无论亲朋好友聚会,还是业务谈判,总是少不了麻将的声音。 成都麻将只能包括3种类型:条,筒,万。没有“门、东南西北、红中”。 每种牌都是数字从1到9,每个数字有4张,共36张。筒,万,条均一样。 胡牌简化规则如下:
【思路】
【代码】
package learning; public class majiang { private int[] Tmap = new int[10]; private int[] Dmap = new int[10]; private int[] Wmap = new int[20]; private boolean T =false; private boolean D = false; private boolean W = false; /** * 是否同时有条、筒、万 */ public boolean isTDW(){ return T && D && W; } /** * 是否是连对的胡牌 */ public boolean isLiandui(){ boolean flag = true; for (int i: Tmap){ if(i%2 !=0){ flag=false; } } for (int i: Dmap){ if(i%2 !=0){ flag=false; } } for (int i: Wmap){ if(i%2 !=0){ flag=false; } } return flag; } /** * 用递推来判断是否能胡牌 */ public boolean isHu(int[] map){ boolean onePair = false; //只能有一个对 for (int i = 0 ; i <=9 ;i++){ if(map[i]==0) continue; if(map[i]==2){ map[2]-=2; if(onePair) return false; //如果前面有一个对,则肯定不能胡牌 onePair = true; }else if(map[i] == 3){ int cnt = 0; for (int j = i+1 ; j<=9;j++){ if (map[j]>0){ cnt++; }else { break; } if(cnt==2 || cnt==5 || cnt==8 || cnt==11){ onePair = true; map[i]-=2; map[i]-=1 ; map[i+1]-=1; map[i+2]-=1; }else { map[i]-=3; } } } else if(map[i] ==4){ return false; } else { if(i<=7 && map[i+1]>0 && map[i+2]>0){ map[i]-=1 ; map[i+1]-=1; map[i+2]-=1; }else { return false; } } } return true; } public boolean IsmahjonggWIn(String cards){ for (int i = 0 ; i<cards.length();i++){ switch (cards.charAt(i+1)){ case 'D' :{ int index = cards.charAt(i)-'0'; Dmap[index] ++ ; D =true; continue; } case 'T' :{ int index = cards.charAt(i)-'0'; Tmap[index] ++ ; T =true; continue; } case 'W' :{ int index = cards.charAt(i)-'0'; Wmap[index] ++ ; W =true; continue; } } } boolean canHu = false; if(!isTDW()){ if (isLiandui()){ canHu = true; }else { canHu = isHu(Dmap) && isHu(Tmap) && isHu(Wmap); } }else { canHu =false; } return canHu; } }
说起麻将,那可是川渝市民的最爱,无论亲朋好友聚会,还是业务谈判,总是少不了麻将的声音。 成都麻将只能包括3种类型:条,筒,万。没有“门、东南西北、红中”。 每种牌都是数字从1到9,每个数字有4张,共36张。筒,万,条均一样。 胡牌简化规则如下:
【思路】
【代码】