扑克牌的顺子

题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。


思路:我们将2张王抽象成数字0,
1. 首先如果五张牌中有 非0重复的牌的话,肯定不是顺子;
2. 一副牌中王的数目也不应该超过2个,当然这里不一定只有一副牌,我们暂且按一副牌考虑,因为0的数目少,要求就严格一点
3. 如果五张牌中最大的牌比最小的非大小王牌大超过4,肯定不是顺子:
a. 如果最大值是7,最小值是3,那么中间的三种牌无论是(4,5,6),还是2个数字一个王,或者2个王一个数字,都是一个顺子;
b. 如果最大值是8,最小值是3,那即使中间三张都是0(王),也连不成顺子;

不知道只有想对不对,如果你想出反例,请告诉我一声
#include<iostream>
#include<cstring>
using namespace std;

bool fun(int a[],int len)
{
     int max = 3;
     int min = 13;
     int zero = 0;
     
     sort(a,a+len);//sorted
     
     int tmp = a[0];
     for(int i=1;i<len;i++)//check there are no duplicate non-zero numbers
     {
             if(a[i]!=tmp)
             {
                          tmp = a[i];
             }else{
                   if(a[i]!=0)//if there is duplicate non-zero numbers, return false 
                              return false;         
             }
     }
     for(int i=0;i<len;i++)//statistic the maximum and minimum value, and the number of 0
     {
             if(a[i] == 0)
                     zero++;
             else{
                  if(a[i]>max)
                              max = a[i];
                  if(a[i]<min)
                              min = a[i];
             }
     }
     if(zero>2)//the number of hero should not exceeds 2 
               return false;
     if(max-min<5)
                  return true;
     else
         return false;
 
}
int main()
{
   int a[]={0,0,9,5,6};
   if(fun(a,5))
               cout<<"is a sequence."<<endl;
   else
               cout<<"is not a sequence."<<endl;
   getchar();
   return 0 ;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值