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");
} }

欧拉工程第54题:Poker hands的更多相关文章

  1. 欧拉工程第69题:Totient maximum

    题目链接 欧拉函数φ(n)(有时也叫做phi函数)可以用来计算小于n 的数字中与n互质的数字的个数. 当n小于1,000,000时候,n/φ(n)最大值时候的n. 欧拉函数维基百科链接 这里的是p是n ...

  2. 欧拉工程第70题:Totient permutation

    题目链接 和上面几题差不多的 Euler's Totient function, φ(n) [sometimes called the phi function]:小于等于n的数并且和n是互质的数的个 ...

  3. 欧拉工程第67题:Maximum path sum II

    By starting at the top of the triangle below and moving to adjacent numbers on the row below, the ma ...

  4. 欧拉工程第66题:Diophantine equation

    题目链接 脑补知识:佩尔方差 上面说的貌似很明白,最小的i,对应最小的解 然而我理解成,一个循环的解了,然后就是搞不对,后来,仔细看+手工推导发现了问题.i从0开始变量,知道第一个满足等式的解就是最小 ...

  5. 欧拉工程第65题:Convergents of e

    题目链接 现在做这个题目真是千万只草泥马在心中路过 这个与上面一题差不多 这个题目是求e的第100个分数表达式中分子的各位数之和 What is most surprising is that the ...

  6. 欧拉工程第56题:Powerful digit sum

    题目链接   Java程序 package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; im ...

  7. 欧拉工程第55题:Lychrel numbers

    package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; import java.util ...

  8. 欧拉工程第53题:Combinatoric selections

    package projecteuler51to60; class p53{ void solve1(){ int count=0; int Max=1000000; int[][] table=ne ...

  9. 欧拉工程第52题:Permuted multiples

    题目链接 题目: 125874和它的二倍,251748, 包含着同样的数字,只是顺序不同. 找出最小的正整数x,使得 2x, 3x, 4x, 5x, 和6x都包含同样的数字. 这个题目相对比较简单 暴 ...

随机推荐

  1. iOS中MVC设计模式

    在组织大型项目的代码文件时,我们常用MVC的思想.MVC的概念讲起来非常简单,就和对象(object)一样.但是理解和应用起来却非常困难.今天我们就简单总结一下MVC设计理念. MVC(Model V ...

  2. [转]Gridview中实现RadioButton单选效果

    HTML <asp:TemplateField ItemStyle-Width="22px"> <ItemTemplate> <asp:RadioBu ...

  3. 查看图片真正的格式,在不知道扩展名的情况下区分是jpeg还是bmp

    用系统自带的画图软件打开图片,然后按文件-->另存为就会弹出保存窗口.保存窗口的保存类形就是"照片真正的格式".

  4. Implementation Documentation[转]

    原文地址:http://prasanna-adf.blogspot.tw/2009/04/implementation-documentation.html Following are the lis ...

  5. SQL SERVER定时任务执行跟踪--供远程查看 [原创]

    一.背景 每次查需要优化的SQL都需要上外网,通过Profiler,报表或者DMV执行特定sql来查找,来回跑很麻烦,能不能在本地直接监控外网的好性能的SQL呢?方法是有的,我们可以通过把Profil ...

  6. 文档对象模型(DOM)

    文档对象模型(DOM)    DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的结构.节点分为几种不同的类型:文档型节点.元素节点.特性节点.注释节点等共有12种节点类型.DOM1级定义了 ...

  7. ubuntu cron.hourly不运行

    服务器没有装NTP,要每天向特定的server进行时间同步,写了一个定时任务,放在/etc/cron.daily下,但是不运行. /etc/crontab文件: # /etc/crontab: sys ...

  8. JIRA安装过程中链接mysql的问题!

    测试下我使用的是mysql7.5的版本,JIRA是6.3.6!这是版本引起的问题! 服务器上原生的mysql驱动jar包:Mysql-connector-java-5.1.18-bin 可参考:htt ...

  9. 十个优秀的C语言学习资源推荐

    学习C语言,需要一点一滴,沉下心来,找个安静的地方,泡上一杯咖啡,在浓郁的香味中一起品味她.-- Boatman Yang 人们通常认为计算机编程很烦,但是有些人却从中发现了乐趣.每一个程序员不得不跟 ...

  10. python-面向对象(指数对象举例)

    class Index(object): def __init__(self,index_name,index_code,closePrice_yesterday,closePrice_today): ...