[swustoj 1088] 德州扑克
德州扑克(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
疯狂地模拟、不要问为什么、不会、贴个代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
#define N 15 struct Card
{
int point;//点数,颜色
char color;
}; struct Maxcard
{
int point[];//点数
int flag;//牌型
}maxcard[N]; Card card[];
Card Pcard[N][];
Card Ccard[];
int n; bool cmp(Card a,Card b)
{
return a.point>b.point;
} void init()//把每个选手的最大牌先初始化为最小
{
for(int i=;i<n;i++)
{
maxcard[i].flag=;
maxcard[i].point[]=;
maxcard[i].point[]=;
maxcard[i].point[]=;
maxcard[i].point[]=;
maxcard[i].point[]=;
}
} int getp(char p[])
{
int pp;
if(strcmp(p,"")==)pp=;
else if(p[]>=''&&p[]<='')pp=p[]-'';
else if(p[]=='J')pp=;
else if(p[]=='Q')pp=;
else if(p[]=='K')pp=;
else pp=;
return pp;
} Maxcard gettype(Card select[])
{
sort(select,select+,cmp);
bool samec=true;
bool isstr=true;
int i;
for(i=;i<;i++)//判断同花和顺子
{
if(select[i].color!=select[i-].color)samec=false;
if(select[i].point!=select[i-].point-)isstr=false;
}
if(select[].point==&&select[].point==&&select[].point==&&select[].point==&&select[].point==)//A2345的情况
{
isstr=true;
for(i=;i<;i++)select[i].point=select[i+].point;
select[].point=;
}
Maxcard ret;
for(i=;i<;i++)ret.point[i]=select[i].point;
int vis[]={};
int maxsame=,secsame=,maxi;
for(i=;i<;i++)
{
vis[ret.point[i]]++;
if(vis[ret.point[i]]>maxsame)maxsame=vis[ret.point[i]],maxi=ret.point[i];
}
for(i=;i<=;i++)
{
if(maxi!=i&&vis[i]>secsame)secsame=vis[i];
}
if(samec&&isstr)ret.flag=;//同花顺
else if(maxsame==)ret.flag=;//四条
else if(maxsame==&&secsame==)ret.flag=;//葫芦
else if(samec)ret.flag=;//同花
else if(isstr)ret.flag=;//顺子
else if(maxsame==)ret.flag=;//三条
else if(maxsame==&&secsame==)ret.flag=;//两对
else if(maxsame==)ret.flag=;//一对
else ret.flag=;//高牌
return ret;
} int biger(Maxcard a,Maxcard b)
{
if(a.flag<b.flag)return ;
else if(a.flag>b.flag)return -;
else
{
for(int i=;i<;i++)
{
if(a.point[i]>b.point[i])return ;
else if(a.point[i]<b.point[i])return -;
}
return ;
}
} void solve()
{
Card temp[];
Card select[];
int i,j,k,l,cnt;
for(i=;i<;i++)temp[i]=Ccard[i-];
for(i=;i<n;i++)//计算每位玩家最大的牌
{
temp[]=Pcard[i][];
temp[]=Pcard[i][];
for(j=;j<;j++)//枚举第一张不要的牌
{
for(k=j+;k<;k++)//枚举第二张不要的牌
{
cnt=;
for(l=;l<;l++)
{
if(l!=j&&l!=k)select[cnt++]=temp[l];
}
Maxcard tt=gettype(select);
if(biger(tt,maxcard[i])==)maxcard[i]=tt;
}
}
}
cnt=;
int ansi[N];
Maxcard ans=maxcard[];
ansi[]=;
for(i=;i<n;i++)
{
if(biger(maxcard[i],ans)==)
{
cnt=;
ans=maxcard[i];
ansi[cnt++]=i;
}
else if(biger(maxcard[i],ans)==)
{
ansi[cnt++]=i;
}
}
printf("%d\n",cnt);
printf("%d",ansi[]+);
for(i=;i<cnt;i++)printf(" %d",ansi[i]+);
printf("\n");
} int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
int i;
char p[],c[];
for(i=;i<n;i++)
{
scanf("%s%s",p,c);
Pcard[i][].point=getp(p);
Pcard[i][].color=c[];
scanf("%s%s",p,c);
Pcard[i][].point=getp(p);
Pcard[i][].color=c[];
}
for(i=;i<;i++)
{
scanf("%s%s",p,c);
Ccard[i].point=getp(p);
Ccard[i].color=c[];
}
solve();
}
return ;
}
[swustoj 1088] 德州扑克的更多相关文章
- java和h5 canvas德州扑克开发中(二)
德州扑克网页源码在github上分享 https://github.com/lxr1907/pokers 感兴趣的可以上去看下. 1.通讯使用websocket,主要在message.js中. 2.用 ...
- java和h5 canvas德州扑克开发中(一)
先附上我的德州扑克测试地址 http://120.26.217.116:8080/LxrTexas/texasIndex.html 我和一个朋友的德州扑克历时一个多月开发,目前已经基本可玩. 前端主要 ...
- 德州扑克AI WEB版
继续之前的德州扑克话题,上次的DOS界面确实没法看,我女朋友说这是什么鬼.哈哈,估计只有自己能玩了 这两天重构了一下界面,基于web服务器和浏览器来交互. 服务器和客户端之间用websocket通信, ...
- 德州扑克AI实现 TexasHoldem Poker
参考了一下这篇文献,http://cowboyprogramming.com/2007/01/04/programming-poker-ai/ 自己用go实现了一个德州扑克AI,效果还可以. 正常和它 ...
- 2015华为德州扑克入境摘要——软体project
直到6一个月2号下午12时00,华为长达一个月的德州扑克锦标赛落下帷幕也被认为是. 我们的团队一直共同拥有3民,间.一个同学(吴)负责算法设计,一个同学(宋)负责分析消息,而我负责的实现框架设计和详细 ...
- 德州扑克AI--Programming Poker AI(译)
前言: 最近在研究德州扑克的AI, 也想由浅入深的看下, 在网上找了一圈, 发现很多文章都提到了一篇文章: Programming Poker AI. 仔细拜读了一下, 觉得非常不错. 这里作下简单的 ...
- 德州扑克AI
德州扑克: 1:outs数,就是所听的牌的数量. 例子: 1:听顺子 4567 outs数就是8,能够成顺子的牌为3和8. 5689 outs数就是4,能够成顺子的牌只有7. 2:听同花 35 ...
- 德州扑克AK打法攻略
AK是所有德扑网游中最受争议的底牌,也是一副令人又爱又恨的底牌.<德州扑克培训大师>根据国内德州扑克网游特性,为大家制作了第一套AK打法攻略,希望所有玩家从今天开始能正确认识AK,发挥AK ...
- 实现简易版德州扑克|学习麻瓜编程以项目为导向入门前端 HTML+CSS+JS
实现简易版德州扑克 1.先上达到网页效果图(简易版德州扑克) 网页分为发牌区和牌池,上面为发牌区,下面是牌池区 2. 代码实现 2.1 HTML和JS代码 ` <link rel="s ...
随机推荐
- 百度地图api的实现
获取客户端IP地址经纬度所在城市 <?php $getIp=$_SERVER["REMOTE_ADDR"]; echo 'IP:',$getIp; echo ''; $con ...
- python中文件的复制
python中文件的复制 python的os模块有很多文件目录相关的函数,但没有提供直接复制文件的函数,当然可以通过边都边写的方式复制文件.想要直接复制文件可以通过shutil模块 shutil模块是 ...
- C中浮点数转字符串
求浮点数转换成字符串,如何才能获得比较正确的字符串.用printf("%f\n", (float)5); 这种方式转换出来的结果是 5.000000 ,末尾都会带6位小数. 控制精 ...
- vim使用总结
tar -xf vim.tar -C ~ vim /etc/vimrc vim /root/.vimrc set ts=4 设置tab有多少空格 set ai 自动对齐 set nu set mous ...
- servlet的生命周期与工作原理、使用!
概念: Servlet是一个java程序运行在服务器上,处理客户端请求并做粗响应的程序!Servlet是和平台无关的服务器组件,它运行在Servlet容器中,Servlet容器 负责servlet和客 ...
- C语言关键字-volatile
1.C语言关键字volatile C 语言关键字volatile(注意它是用来修饰变量而不是上面介绍的__volatile__)表明某个变量的值可能在外部被改变,因此对这些变量的存取 不能缓存 ...
- (转)Linux SLUB 分配器详解
原文网址:https://www.ibm.com/developerworks/cn/linux/l-cn-slub/ 多年以来,Linux 内核使用一种称为 SLAB 的内核对象缓冲区分配器.但是, ...
- 利用开源项目使discus论坛与java应用同步登录和注册
最近做了一个资源库系统的项目,老师说可以搭建开源论坛替代自己开发社交模块(评论啊,反馈啊)来减轻负担,甚至提到了要给每个资源开一帖的功能..使我十分怀疑到底是减轻负担还是增加负担...不过怀疑归怀疑, ...
- tomcat 配置虚拟路径
把图片或者其他的文件传到webapps以外的目录 <Context docBase= "e:\image\" path= "/uploads" rel ...
- 1061: [Noi2008]志愿者招募 - BZOJ
Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完 ...