德州扑克(1088)

问题描述

德州扑克是一款风靡全球的扑克游戏。德州扑克一共有52张牌,没有王牌。每个玩家分两张牌作为“底牌”,五张由荷官陆续朝上发出的作为公共牌。开始的时候,每个玩家会有两张面朝下的底牌。经过所有押注圈后,若仍不能分出胜负,游戏会进入“摊牌”阶段,也就是让所剩的玩家亮出各自的底牌以较高下,持大牌者获胜。因技巧性强,易学难精又被称为“扑克游戏中的凯迪拉克”。

现在有N个玩家进入摊牌阶段(编号为1到N),摊牌阶段比大小的规则是,用自己的2张底牌和5张公共牌结合在一起,选出5张牌,不论手中的牌使用几张(甚至可以不用手中的底牌),凑成最大的成牌,跟其他玩家比大小。比牌先比牌型,大的牌型大于小的牌型,牌型一般分为10种,从大到小为:

1.皇家同花顺:最高为Ace(一点)的同花顺。

如A K Q J 10 的同花顺

2.同花顺:同一花色,顺序的牌。

如:K Q J 10 9 的同花顺

3.四条:有四张同一点数的牌。

如:4 4 4 4 9

4.葫芦:三张同一点数的牌,加一对其他点数的牌。

如:3 3 3 10 10

5.同花:五张同一花色的牌。

如:J 10 8 7 5 的全是红桃的牌

6.顺子:五张顺连的牌。

如:5 4 3 2 A 的非同花牌(此牌型为最小的顺子)

7.三条:仅有三张同一点数的牌,其余两张点数不同。

如: 9 9 9 5 3

8:两对:两张相同点数的牌,加另外两张相同点数的牌。

如:K K 5 5 2

9.一对:仅有两张相同点数的牌。

如:10 10 9 4 2

10.高牌:不符合上面任何一种牌型的牌型,由单牌且不连续不同花的组成,以点数决定大小。

如:A 10 9 5 3 的非同花的牌

点数大小为A>K>Q>J>10>9>8>7>6>5>4>3>2,

若两个牌牌型相同,则比较点数,点数比较为从两副牌最大的牌到最小的牌依次开始比较大小,若出现某张牌大于对手的牌,则获胜。如A 8 7 4 2和A 6 5 3 1,先比较最大的,两幅都是A,继续比较次大的,8>7,则第一副牌获胜。(顺子5 4 3 2 A特判)

若两副牌大小相同,则他们同时获胜。

现在问这N个玩家哪些玩家获胜。(牌最大)

输入

多组测试数据,每组先输入N(2<=N<=10),代表玩家个数,接下来N行,每行4个数据X1i C1i X2i C2i,X1i,C1i表示第i个玩家的第一张牌,X1i表示牌的点数(A,2,3到K),C1i表示花色(S表示黑桃,H表示红心,C表示草花,D表示方片),同理X2i C2i表示第二张牌。然后是10个数据X1C,C1C......X10C,C10C。表示5张公共牌。

输出

第一行输出获胜玩家的个数,第二行输出获胜玩家的编号(由小到大)。

样例输入

3
A H A S
2 H 3 H
4 C 5 D
A D A C 4 H 5 H 6 H
2
A H A S
A C A D
5 D 6 C 7 D 8 H 10 C

样例输出

1
2
2
1 2

疯狂地模拟、不要问为什么、不会、贴个代码

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. #define N 15
  7.  
  8. struct Card
  9. {
  10. int point;//点数,颜色
  11. char color;
  12. };
  13.  
  14. struct Maxcard
  15. {
  16. int point[];//点数
  17. int flag;//牌型
  18. }maxcard[N];
  19.  
  20. Card card[];
  21. Card Pcard[N][];
  22. Card Ccard[];
  23. int n;
  24.  
  25. bool cmp(Card a,Card b)
  26. {
  27. return a.point>b.point;
  28. }
  29.  
  30. void init()//把每个选手的最大牌先初始化为最小
  31. {
  32. for(int i=;i<n;i++)
  33. {
  34. maxcard[i].flag=;
  35. maxcard[i].point[]=;
  36. maxcard[i].point[]=;
  37. maxcard[i].point[]=;
  38. maxcard[i].point[]=;
  39. maxcard[i].point[]=;
  40. }
  41. }
  42.  
  43. int getp(char p[])
  44. {
  45. int pp;
  46. if(strcmp(p,"")==)pp=;
  47. else if(p[]>=''&&p[]<='')pp=p[]-'';
  48. else if(p[]=='J')pp=;
  49. else if(p[]=='Q')pp=;
  50. else if(p[]=='K')pp=;
  51. else pp=;
  52. return pp;
  53. }
  54.  
  55. Maxcard gettype(Card select[])
  56. {
  57. sort(select,select+,cmp);
  58. bool samec=true;
  59. bool isstr=true;
  60. int i;
  61. for(i=;i<;i++)//判断同花和顺子
  62. {
  63. if(select[i].color!=select[i-].color)samec=false;
  64. if(select[i].point!=select[i-].point-)isstr=false;
  65. }
  66. if(select[].point==&&select[].point==&&select[].point==&&select[].point==&&select[].point==)//A2345的情况
  67. {
  68. isstr=true;
  69. for(i=;i<;i++)select[i].point=select[i+].point;
  70. select[].point=;
  71. }
  72. Maxcard ret;
  73. for(i=;i<;i++)ret.point[i]=select[i].point;
  74. int vis[]={};
  75. int maxsame=,secsame=,maxi;
  76. for(i=;i<;i++)
  77. {
  78. vis[ret.point[i]]++;
  79. if(vis[ret.point[i]]>maxsame)maxsame=vis[ret.point[i]],maxi=ret.point[i];
  80. }
  81. for(i=;i<=;i++)
  82. {
  83. if(maxi!=i&&vis[i]>secsame)secsame=vis[i];
  84. }
  85. if(samec&&isstr)ret.flag=;//同花顺
  86. else if(maxsame==)ret.flag=;//四条
  87. else if(maxsame==&&secsame==)ret.flag=;//葫芦
  88. else if(samec)ret.flag=;//同花
  89. else if(isstr)ret.flag=;//顺子
  90. else if(maxsame==)ret.flag=;//三条
  91. else if(maxsame==&&secsame==)ret.flag=;//两对
  92. else if(maxsame==)ret.flag=;//一对
  93. else ret.flag=;//高牌
  94. return ret;
  95. }
  96.  
  97. int biger(Maxcard a,Maxcard b)
  98. {
  99. if(a.flag<b.flag)return ;
  100. else if(a.flag>b.flag)return -;
  101. else
  102. {
  103. for(int i=;i<;i++)
  104. {
  105. if(a.point[i]>b.point[i])return ;
  106. else if(a.point[i]<b.point[i])return -;
  107. }
  108. return ;
  109. }
  110. }
  111.  
  112. void solve()
  113. {
  114. Card temp[];
  115. Card select[];
  116. int i,j,k,l,cnt;
  117. for(i=;i<;i++)temp[i]=Ccard[i-];
  118. for(i=;i<n;i++)//计算每位玩家最大的牌
  119. {
  120. temp[]=Pcard[i][];
  121. temp[]=Pcard[i][];
  122. for(j=;j<;j++)//枚举第一张不要的牌
  123. {
  124. for(k=j+;k<;k++)//枚举第二张不要的牌
  125. {
  126. cnt=;
  127. for(l=;l<;l++)
  128. {
  129. if(l!=j&&l!=k)select[cnt++]=temp[l];
  130. }
  131. Maxcard tt=gettype(select);
  132. if(biger(tt,maxcard[i])==)maxcard[i]=tt;
  133. }
  134. }
  135. }
  136. cnt=;
  137. int ansi[N];
  138. Maxcard ans=maxcard[];
  139. ansi[]=;
  140. for(i=;i<n;i++)
  141. {
  142. if(biger(maxcard[i],ans)==)
  143. {
  144. cnt=;
  145. ans=maxcard[i];
  146. ansi[cnt++]=i;
  147. }
  148. else if(biger(maxcard[i],ans)==)
  149. {
  150. ansi[cnt++]=i;
  151. }
  152. }
  153. printf("%d\n",cnt);
  154. printf("%d",ansi[]+);
  155. for(i=;i<cnt;i++)printf(" %d",ansi[i]+);
  156. printf("\n");
  157. }
  158.  
  159. int main()
  160. {
  161. while(scanf("%d",&n)!=EOF)
  162. {
  163. init();
  164. int i;
  165. char p[],c[];
  166. for(i=;i<n;i++)
  167. {
  168. scanf("%s%s",p,c);
  169. Pcard[i][].point=getp(p);
  170. Pcard[i][].color=c[];
  171. scanf("%s%s",p,c);
  172. Pcard[i][].point=getp(p);
  173. Pcard[i][].color=c[];
  174. }
  175. for(i=;i<;i++)
  176. {
  177. scanf("%s%s",p,c);
  178. Ccard[i].point=getp(p);
  179. Ccard[i].color=c[];
  180. }
  181. solve();
  182. }
  183. return ;
  184. }

[swustoj 1088] 德州扑克的更多相关文章

  1. java和h5 canvas德州扑克开发中(二)

    德州扑克网页源码在github上分享 https://github.com/lxr1907/pokers 感兴趣的可以上去看下. 1.通讯使用websocket,主要在message.js中. 2.用 ...

  2. java和h5 canvas德州扑克开发中(一)

    先附上我的德州扑克测试地址 http://120.26.217.116:8080/LxrTexas/texasIndex.html 我和一个朋友的德州扑克历时一个多月开发,目前已经基本可玩. 前端主要 ...

  3. 德州扑克AI WEB版

    继续之前的德州扑克话题,上次的DOS界面确实没法看,我女朋友说这是什么鬼.哈哈,估计只有自己能玩了 这两天重构了一下界面,基于web服务器和浏览器来交互. 服务器和客户端之间用websocket通信, ...

  4. 德州扑克AI实现 TexasHoldem Poker

    参考了一下这篇文献,http://cowboyprogramming.com/2007/01/04/programming-poker-ai/ 自己用go实现了一个德州扑克AI,效果还可以. 正常和它 ...

  5. 2015华为德州扑克入境摘要——软体project

    直到6一个月2号下午12时00,华为长达一个月的德州扑克锦标赛落下帷幕也被认为是. 我们的团队一直共同拥有3民,间.一个同学(吴)负责算法设计,一个同学(宋)负责分析消息,而我负责的实现框架设计和详细 ...

  6. 德州扑克AI--Programming Poker AI(译)

    前言: 最近在研究德州扑克的AI, 也想由浅入深的看下, 在网上找了一圈, 发现很多文章都提到了一篇文章: Programming Poker AI. 仔细拜读了一下, 觉得非常不错. 这里作下简单的 ...

  7. 德州扑克AI

    德州扑克: 1:outs数,就是所听的牌的数量. 例子: 1:听顺子 4567 outs数就是8,能够成顺子的牌为3和8. 5689 outs数就是4,能够成顺子的牌只有7. 2:听同花     35 ...

  8. 德州扑克AK打法攻略

    AK是所有德扑网游中最受争议的底牌,也是一副令人又爱又恨的底牌.<德州扑克培训大师>根据国内德州扑克网游特性,为大家制作了第一套AK打法攻略,希望所有玩家从今天开始能正确认识AK,发挥AK ...

  9. 实现简易版德州扑克|学习麻瓜编程以项目为导向入门前端 HTML+CSS+JS

    实现简易版德州扑克 1.先上达到网页效果图(简易版德州扑克) 网页分为发牌区和牌池,上面为发牌区,下面是牌池区 2. 代码实现 2.1 HTML和JS代码 ` <link rel="s ...

随机推荐

  1. 使用FileResult导出txtl数据文件

    public FileResult ExportMobileNoTxt(SearchClientModel model){ var sbTxt = new StringBuilder(); ; i & ...

  2. Battle Over Cities (25)(DFS、连通图)

    It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...

  3. ISBN

    问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位 ...

  4. 使用泛型 类型“System.Collections.Generic.IEnumerator<T>”需要 1 个类型参数

    解决办法:添加 using System.Collections:命名空间

  5. 导入 Mysql 示例数据库 employees

    Mysql也有跟Oracle的scott与employees相似的数据库,这样就免除了每次都要自己建表并插入数据了. Mysql提供的供练习使用的数据库employees,下面地址:https://l ...

  6. Device eth0 does not seem to be present

    解决办法: 首先,打开/etc/udev/rules.d/70-persistent-net.rules内容如下面例子所示: # vi /etc/udev/rules.d/70-persistent- ...

  7. Hibernate从入门到精通(二)Hibernate实例演示

    上篇Hibernate从入门到精通(一)JDBC简介,我们主要对JDBC进行了简单介绍和使用说明,这次我们做一个Hibernate简单实例,通过这个实例对比Hibernate和JDBC,了解Hiber ...

  8. myEclipse中的web项目直接引入到eclipse中运行

    首先打开项目属性(Properties),如果动态web项目被作为普通java项目引进去,需要首先修改为web项目,如下图: 确定后即可在eclipse中看到转换为了动态的web项目,然后继续属性(P ...

  9. swift基础--数组、字典

    (1)初始化 (2)新增.修改.删除 (3)清空 (4)遍历 var array1 = ["x","y","z"] var array2:[ ...

  10. Telerik 控件事例(鼠标拖动行,拖动列,设置行对齐,行宽,是否显示)

    People.cs using System;using System.Collections.Generic;using System.Data;using System.Linq;using Sy ...