现在的位置: 首页 > 综合 > 正文

67 俩个闲玩娱乐。 1.扑克牌的顺子

2018年05月02日 ⁄ 综合 ⁄ 共 1101字 ⁄ 字号 评论关闭

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

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

5张牌看成由5个数字组成的数组。大小王当成0.我们把数组排序。由于0可以当成任意数字,
我们可以用0去补满数组中的空缺。也就是排序之后的数组不是连续的,
即相邻的两个数字相隔若干个数字,但如果我们有足够的0可以补满这两个数字的空缺,
这个数组实际上还是连续的。
{0,1,3,4,5}。0可以当成2去填补这个空缺,所以是顺子 
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;

bool checkGaps(int a[],int s,int e,int allowGaps)
{
	int i=s;
	while(i<e)
	{
		allowGaps-=a[i+1]-(a[i]+1);
		if(allowGaps<0)
			return false;
		i++;
	}
	return true;
}

bool isStraight(int a[])
{
	sort(a,a+5);
	if(a[0]>0)
		return checkGaps(a,0,4,0);
	else if(a[0]==0&&a[1]!=0)
		return checkGaps(a,1,4,1);
	return checkGaps(a,2,4,2);
}

int main()
{
	int i;
	int a[]={1,0,3,4,5};
	int b[]={0,0,9,5,6};
	int c[]={1,0,2,3,6};
	
	for(i=0;i<5;i++)
		printf("%d",a[i]);
	if(isStraight(a))
		printf(" is straight.\n");
	else
		printf(" is not straight.\n");
		
		
	for(i=0;i<5;i++)
		printf("%d",b[i]);
	if(isStraight(b))
		printf(" is straight.\n");
	else
		printf(" is not straight.\n");
		
		
	for(i=0;i<5;i++)
		printf("%d",c[i]);
	if(isStraight(c))
		printf(" is straight.\n");
	else
		printf(" is not straight.\n");
	
	return 0;
}

抱歉!评论已关闭.