Hoodlum1980 (fafa)'s Technological Blog

Languages mainly using and digging: C / CPP, ASM, C#, Python. Other languages:Java.

博客园 首页 新随笔 联系 订阅 管理

          Poker Hands (比较两手牌的大小)

          http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=111

          题目描述:这道题要求比较两手牌的大小。每手牌都有5张牌组成,牌的大小的定义如下,首先确定这组牌的所属种类是下面哪一种(若同属同一种类,则根据该分类后面的比较规则继续比较,所属种类越靠后牌越大)。

          ● High Card:杂牌(不属于下面任何一种)。根据牌从大到小的顺序依次比较。

          ● Pair:有一对,加3张杂牌组成。先比较对的大小,再从大到小的顺序比较杂牌。

          ● Two Pairs:有两对,加1帐杂牌。先从大到小比较对的大小,再比较杂牌。

          ● Three of a Kind:有3张值相同的牌。比较这个值即可。

          ● Straingt:一条龙。即5张牌连续。比较最大的一张牌即可。

          ● Flush:清一色。即5张牌花色相同。和杂牌一样比较。

          ● Full House:3张值相同的牌,加上一对。比较三张相同的值即可。

          ● Four of a kind:有4张牌相同,即相当于一副“炸弹”。

          ● Straight flush:同花顺。即5张牌花色相同,并且连续。例如同花色的34567。

          题目输入多行,每一行含有10张牌,前五张属于Black,后五张属于White,每张牌由“牌值”字符和“花色”字符组成,注意10用大写字母T表示。牌从小到大的顺序是2,3,4,5,6,7,8,9,T,J,Q,K,A。要求输出比较结果。

          例如输入:

          2H 3D 5S 9C KD 2C 3H 4S 8C AH   (输出:White wins.)

          2H 4S 4C 2D 4H 2S 8S AS QS 3S   (输出:Black wins.)

          2H 3D 5S 9C KD 2C 3H 4S 8C KH  (输出:Black wins.)

          2H 3D 5S 9C KD 2D 3H 5C 9S KH  (输出:Ties.)

          ----------------------------------------------------------------------------------------

          分析:该题目还是属于一道简单题,我们只需要根据题目要求的比较规则去比较即可,我们假设一副牌所属的种类,用level值表示,level越大则牌越大。使用一个函数 int GetLevel(...) 来获取一副牌所属的种类。这里再判断牌的level之前,由于输入是乱序的,为了判别我们需要先把5张牌按从小到大的顺序排序。这里的排序只有5张牌,属于非常小规模的问题,因此我使用了交换数据成本最低的选择排序。同时,两幅牌的level如果相同,则我们还要具体根据牌的点数(value)做进一步判断,因此我们给GetLevel函数再传入一个int数组,把同level的继续比较的指标点数按顺序放入这个数组。这样,当level相同时,我们就继续从头查看order数组里的判别指标来继续判断。该题目的全部代码如下:

ZOJ_1111_POKER_HANDS

          C代码在ZOJ上的典型内存是160K,因此该代码在AC后顺利跻身解排行榜的第一位。虽然这个题目比较简单,在我看到这个题目的时候就有了AC的把握。代码也很快写好了,然而此后的过程却使得该题成为我AC的最坎坷的题目之一,非常痛苦,在我信心满满确认无误的提交后,却发现每次都是的Segment Fault错误,在无数次调节输入和数组长度后都无法解决该问题,导致我百思不得其解!仔细检查也发现不了任何有野指针或者越界之类的错误。灰心失望之际我把代码拷贝到VC6里面编译,结果VC6的一个警告马上让我发现了问题所在:

          原来问题出在我无论如何也不会怀疑的核心判别函数上,即GetLevel函数里的一个判别:

          在给t1,t2,t3赋值时,我把t1=.., t2=.., t3=..,粗心的写作了t1=.., t2=.., t1=..; 导致t3是一个不确定值,从而使后续的代码发生了越界!汗!而在TC2.0中却没有给出任何警告! 再改正这个问题以后顺利AC。

posted on 2008-10-24 23:32  hoodlum1980  阅读(1405)  评论(4编辑  收藏  举报