1678 - 顺子
时间限制 : 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; } }