problem 1111(design)

   现在还没有开始写代码,因为任务显然比较艰巨,还是先理一下思路比较好。

   首先,一手牌一共分成九个等级(0:highcard散牌,1:pair对子,2:twopairs两对,3:three三条,4:straight顺子,5:flush同花,6:fullhouse葫芦,7:four四条,8:straightflush同花顺)。对于不同等级之间的比较是编号大的赢。

   其次,对于同一等级之间的比较大致可以分为四种。1、顺子,同花顺(比最大的)。2、散牌,同花(一张张比)3、对子,两对(这个比较麻烦)。4、三条,葫芦,四条(比“主牌”)。第三种比较分成二步其实也不难。

   再是怎么样区分出九个等级呢?可以这样考虑:假设现在桌子上有13个凹槽(2-14编号)分别与13张牌面相对应。我们把一手牌(五张)放到对应编号的槽里面。那么如果我们扫描一遍所有的槽并分别记录每个槽里面牌的数量(略去0),就会出现六种情况(顺序方面可以是任意的):1、11111(对应等级编号0、4、5、8)。2、1211(对子)。3、212(两对)。4、131(三条)。5、32(葫芦)。6、14(四条)。我们再扫描一遍刚才扫描的结果,记录最大数量和牌种类的数量。1、11111(1,5)。2、1211(2,4)。3、212(2,3)。4、131(3、3)。5、32(3、2)。6、14(4、2)。这样就区别开这六种情况了。

   “11111”情况对应“散牌”“顺子”“同花”“同花顺”还需要再区分,设置两个标记,一个表示是否为“顺子”(1是0不是)一个表示是否为“同花”(1是0不是)。这样00表示“散牌”01表示“同花”10表示“顺子”11表示“同花顺”。

   “同花”很容易判断。

   “顺子”可以这样判断:因为事先已经确定这是孤张牌了(11111),所以只要最大值和最小值的差为4(一共五张牌)就一定是“顺子”反之则不是。

   “221”和“2111”比较麻烦。可以先进行qsort排序(一共只有五张牌qsort对数量小于8的数组排序是非常快的)把值相同的牌变成相邻的牌,从中选择出对子进行比较,最后比较剩下的牌。

   一个半小时过去了......(code)

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值