1678 - 顺子

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

"赢了!我顺子!"也许在准备计算机考研的无聊时光里,打牌是最好的消遣方式了。只是,现在有5张牌在手里,它们构成顺子吗?

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。
我们可以把5张牌看成由5个数字组成的数组。大小王是特殊的数字,我们不妨把它们都当成0。

题目输入

输入有多组数据。

每组数据一行,5个非负整数(不大于13),各代表一张牌。

题目输出

对应每组数据,如果5张牌构成顺子则输出1,否则输出0。

输入/输出样例

输入格式

0 1 3 4 5
1 10 11 12 13
0 0 7 7 0

输出格式

1
0
0

C语言解答

#include<stdio.h>
int main()
{
	int a[5],i,c,j,t,n;
	while(scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4])!=EOF)
	{
	c=0;
	for(i=0;i<5;i++)
	{if(a[i]==0)c++;}
	for(i=1;i<5;i++)
	for(j=0;j<5-i;j++)
	if(a[j]>a[j+1])
	{
		t=a[j];
		a[j]=a[j+1];
		a[j+1]=t;
	}
	
	for(i=c;i<4;i++)
	if(a[i]==a[i+1])break;
	if(i==4&&a[4]-a[c]<=4||c==4||c==5)
	printf("1\n");
	else printf("0\n");
}}

C++解答

#include <vector>
#include <stdio.h>
#include <algorithm>
// Determine whether numbers in an array are continuous
// Parameters: numbers: an array, each number in the array is between
//             0 and maxNumber. 0 can be treeted as any number between
//             1 and maxNumber
//             maxNumber: the maximum number in the array numbers
bool IsContinuous(std::vector<int> numbers, int maxNumber)
{
    if(numbers.size() == 0 || maxNumber <=0)
        return false;
    // Sort the array numbers. 
    std::sort(numbers.begin(), numbers.end());
    int numberOfZero = 0;
    int numberOfGap = 0;
    // how many 0s in the array?
    std::vector<int>::iterator smallerNumber = numbers.begin();
    while(smallerNumber != numbers.end() && *smallerNumber == 0)
    {
        numberOfZero++;
        ++smallerNumber;
    }
    // get the total gaps between all adjacent two numbers
    std::vector<int>::iterator biggerNumber = smallerNumber + 1;
    while(biggerNumber < numbers.end())
    {
        // if any non-zero number appears more than once in the array,
        // the array can't be continuous
        if(*biggerNumber == *smallerNumber)
            return false;
        numberOfGap += *biggerNumber - *smallerNumber - 1;
        smallerNumber = biggerNumber;
        ++biggerNumber;
    }
    return (numberOfGap > numberOfZero) ? false : true; 
}

int main()
{
	int n,i,j;
	std::vector<int> numbers;
	while(1)
	{
		for(i=0;i<5;i++)
		{
			if(scanf("%d",&j)==EOF)
				return 0;
			numbers.push_back(j);
		}
		printf("%d\n",IsContinuous(numbers,13));
		numbers.clear(); 
	}	
	return 0;
}

Java解答

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner cin = new Scanner(System.in);
		while (cin.hasNext()) {
			int card[] = new int[15];
			int temp;

			for (int i = 0; i < 5; i++) {
				temp = cin.nextInt();
				card[temp]++;
			}

			if (isStraight(card))
				System.out.println("1");
			else
				System.out.println("0");
		}

	}

	public static boolean isStraight(int card[]) {

		for (int i = 1; i <= 13; i++)
			if (card[i] > 1)
				return false;

		int maxHasStraight = 0;
		int fiveSum = 0;

		for (int i = 1; i <= 5; i++)
			if (card[i] != 0)
				fiveSum++;

		maxHasStraight = Math.max(maxHasStraight, fiveSum);

		for (int i = 6; i <= 13; i++) {
			if (card[i] != 0)
				fiveSum++;
			if (card[i - 5] != 0)
				fiveSum--;
			maxHasStraight = Math.max(maxHasStraight, fiveSum);

		}

		if (maxHasStraight + card[0] == 5)
			return true;

		return false;
	}

}