题目:从扑克牌中随机抽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 ;
}