梭哈

/*
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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值