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; }