package projecteuler51to60; import java.awt.peer.SystemTrayPeer; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.TreeSet; class Card{ //一张一张的读取,一张牌,以及对于的颜色 public final int rank; public final int suit; public Card(int rank,int suit){ if(rank<0 || rank>= 13 ||suit< 0||suit>= 4) throw new IllegalAccessError(); this.rank= rank; this.suit= suit; } public Card(String str){ this("23456789TJQKA".indexOf(str.charAt(0)), "SHCD".indexOf(str.charAt(1))); } public boolean equals(Object obj) { if (!(obj instanceof Card)) return false; Card other = (Card)obj; return rank == other.rank && suit == other.suit; } public int hashCode() { return rank * 4 + suit; } } class p54{ void solve0(){ String filenameString="src//projecteuler51to60//p054_poker.txt"; readTxtFile(filenameString); } int Judge(String[] twoManCard){ Card[] player1 = new Card[5]; Card[] player2 = new Card[5]; for(int i=0;i<5;i++){ player1[i] = new Card(twoManCard[i+0]); player2[i] = new Card(twoManCard[i+5]); } if (getScore(player1) > getScore(player2)) return 1; return 0; } int getScore(Card[] hand){ if(hand.length !=5) throw new IllegalArgumentException(); int[] rankCounts = new int[13]; int flushSuit = hand[0].suit; //长度是13的数组,数组值是:各位置数出现的次数 //flushSuit 判断颜色是否一样 for(Card card:hand){ rankCounts[card.rank]++; if(card.suit!=flushSuit) flushSuit = -1; } //rankCountHist 统计rankCounts中出现了多少次 0 1 2 3 4 5,rankCounts中所有数之和是5,应该就五张牌 int[] rankCountHist = new int[6]; for(int i=0;i<rankCounts.length;i++) rankCountHist[rankCounts[i]]++; int bestCards = get5FrequnetHighestCards(rankCounts, rankCountHist); int straightHishRank = getStraighHighRank(rankCounts); if(flushSuit!=-1)System.out.println("ok"); // Straight flush if(straightHishRank!=-1 && flushSuit!=-1) return 8<<20|straightHishRank; // Four of a kind else if(rankCountHist[4]==1) return 7<<20|bestCards; // Full house else if(rankCountHist[3]==1&&rankCountHist[2]==1)return 6<<20|bestCards; // Flush else if(flushSuit!=-1) return 5<<20|bestCards; // Straight else if(straightHishRank!=-1) return 4<<20|straightHishRank; // Three of a kind else if(rankCountHist[3]==1) return 3<<20|bestCards; // Two pairs else if(rankCountHist[2]==2) return 2<<20|bestCards; // One pair else if(rankCountHist[2]==1) return 1<<20|bestCards; // High card else return 0<<20|bestCards; } int get5FrequnetHighestCards(int[] ranks,int[] ranksHist) { int result = 0; int count =0; for(int i=ranksHist.length-1;i>=0;i--){ for(int j=ranks.length-1;j>=0;j--){ if(ranks[j]==i){ for(int k=0;k<i&&count<5;k++,count++) result=result<<4|j; } } } return result; } int getStraighHighRank(int[] ranks){ outer: for(int i=ranks.length -1;i>=3;i--){ for(int j=0;j<5;j++){ if(ranks[(i-j+13)%13] ==0) continue outer; } return i; } return -1; } void readTxtFile(String filename){ File fl =new File(filename); int res=0; FileReader reader=null; try { reader = new FileReader(fl); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } BufferedReader br = new BufferedReader(reader); String line=""; try { while((line=br.readLine())!=null){ String[] twoManCard = line.split(" "); res+=Judge(twoManCard); } } catch (IOException e) { // TODO Auto-generated catch block System.out.println("no file"); } System.out.println(res); } } public class Problem54 { public static void main(String[] args){ long begin= System.currentTimeMillis(); new p54().solve0(); long end = System.currentTimeMillis(); long Time = end - begin; System.out.println("Time:"+Time/1000+"s"+Time%1000+"ms"); } }