T2 梭哈
时间限制:1000ms
【问题描述】
你在赌场里玩梭哈,已经被发了4张牌,现在你想要知道发下一张牌后你得到顺子的概率是多少?
假定赌场使用的是一副牌,四种花色的A、2、3、...、J、Q、K共52张,这副牌只发给你了4张,你的剩下一张牌从剩下48张中任意取出一张。
顺子指的是点数连续的五张牌,包括10、J、Q、K、A这种牌型。
注意:
a、顺子不包含同花顺,即构成顺子的五张牌花色不能相同;
b、另外,A、2、3、4、5和2、3、4、5、6都不是顺子。
【标准输入】
第一行为一个整数T,表示测试数据组数。
随后的每一行为四个被空格隔开的长度为2或3的字符串XY,表示你手里的牌。
其中,X为2~10、J、Q、K、A中一个,表示点数;Y为S、H、C、D分别表示黑桃、红心、梅花和方块。
【标准输出】
对于每组数据输出一行,用一个分数表示得到顺子的概率。
注意:你的分数需为最简分数,若答案为0则输出0/1。
【样例输入】
1
10S JS QS KD
【样例输出】
1/6
*/
首先来分析以下几种情况:1:当是2 3 4 5 时,概率为零;
2:当是3 4 5 6 时,只能抽7才是顺子;
3:当是4 5 6 7 时,可以抽8或3凑成顺子;
4:当是4 5 6 8时,只有抽7才可以凑成顺子;
5:当是1 10 11 12 时,只有13才可以凑成顺子;
6:当是1 11 12 13时,只有10才能凑成数字; 其他情况则不是顺子
最后还要考虑一下那个符号,因为不考虑同花顺,所以要加上这种情况的概率!
#include<stdio.h>#include<string.h>
#include<stdlib.h>
char a[4][4],c[4];
int b[4];
int gongyue(int a,int b)
{
int r;
while(b!=0)
{
r=a%b;
a=b;
b=r;
}
return a;
}
int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
double sum=1;
memset(a,'0',sizeof(a));
memset(b,0,sizeof(b));
for(i=0;i<4;i++)
scanf("%s",&a[i]);
for(i=0;i<4;i++)
{
int n=0;
for(j=0;a[i][j]!='\0';j++)
{
if('0'<=a[i][j] && a[i][j]<='9')
{
n=n*10+a[i][j]-'0';
b[i]=n;
}
else
{
int flag=0;
switch(a[i][j])
{
case 'A':b[i]=1;flag=1;break;
case 'J':b[i]=11;flag=1;break;
case 'Q':b[i]=12;flag=1;break;
case 'K':b[i]=13;flag=1;break;
}
if(flag==0)
{
c[i]=a[i][j];
}
}
}
}
for(i=0;i<3;i++)
{
for(j=i+1;j<4;j++)
{
int t;
if(b[i]>b[j])
{
t=b[i];
b[i]=b[j];
b[j]=t;
}
if(b[i]==b[j])
{
sum=0;
}
}
}
if(b[0]==2)
{
sum=0;
}
else if(b[3]-b[0]==3)
{
if(b[0]==3)
{
sum=sum*(double)4/48;
}
else
{
sum=sum*(double)4/48*2;
}
}
else if(b[3]-b[0]==4)
{
sum=sum*(double)4/48;
}
else if((b[0]==1 && b[3]-b[0]<9)||(b[3]-b[0]<9 && b[3]-b[0]>3))
{
sum=0;
}
else if(b[0]==1 && (b[3]-b[0]>=9 &&b[3]-b[0]<=12))
{
sum=sum*(double)4/48;
}
if(c[0]==c[1] && c[1]==c[2] && c[2]==c[3])
{
sum=sum*(double)3/4;
}
if(sum==0)
printf("0/1\n");
else
{
int a;
sum=48*sum;
a=(int)sum;
int b=48,p;
p=gongyue(b,a);
printf("%d/%d\n",a/p,b/p);
}
}
return 0;
}
测试数据:
5
7S 8D 9S 10S
5D 6S 8C 9D
7H 9D 6S 4D
JC 9S KD 10H
3D 4D 5D 6D
结果:
1/6
1/12
0/1
1/12
1/16