题目描述
争上游是一种扑克游戏,其中“顺子”是一种出牌,可以至少脱手5张牌。例如你3,4,5,6,7为顺子。手上牌虽可以配顺子,但并不一定出。如果你同时有2张3,2张4,2张5,则构成3连对,可以打掉而剩下6,7。如果出顺子,则剩下3,4,5单张,更不利于逃牌。又例如,你若有4张6,你可能也不愿意出顺子,因为顺子一出,则6炸弹就没得用了。
假定计算机出牌,给它一个规则,如果顺子中,重复的牌不多于2张,就打顺子。例如拿到的牌中,4有2张,6有3张(2张牌重复),其余有单张3,5,7,则顺子3,4,5,6,7一出,就只有单张4和对子6了,好棒!
如果有一手牌,3,3,4,5,5,5,6,7,7,8,9,9,其中顺子3,4,5,6,7因为中间含3个重复张,不合规则,顺子5,6,7,8,9也不合规则,但是,顺子4,5,6,7,8可以打,因为中间只有5和7两张有重复。
规则避繁就简,只看顺子,不看其他;不看长短,只看可否。下面让你来设计计算机程序。
输入
有多手牌需要判断是否有顺子可出。每手牌第一个整数n为张数(1<=n<=30),后跟n个牌张(牌张点数为1到13之间,且1,2,3,4,5构成顺子,而10,11,12,13,1不构成顺子)。
输出
每手牌若有顺子可出,输出Yes,否则输出No。每个结果占一行。
样例输入
7 5 7 6 8 5 6 9 9 8 10 7 6 5 4 8 4 7
样例输出
Yes No
创立两个数组,一个存储拿到的牌,一个b[14]用来记录几号牌总共有几张
接着我们用循环遍历寻找有没有顺子,建立bool flag来标记,以及两个整数lx,re分别记录连续的牌数是否有5张、5张内是否重复的牌大于2.
注意:因为5张牌才有可能构成顺子,于是可以减少循环次数;同时设置begin来找开始的位置;刚开始连续的牌是1(lx初始化为1)
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int a[31]={0};
int b[14]={0};
int begin=99;
for(int i=0;i<n;i++)
{
cin>>a[i];
b[a[i]]++;
if(a[i]<begin) begin=a[i];
}
bool flag=false;//用flag来标记有没有顺子
for(int i=begin;i<=9;i++)
{
int lx=1,re;
if(b[i]>1) re=1;
else if(b[i]==1) re=0;
else continue;
for(int j=i+1;j<i+5;j++)
{
if(b[j]==0) break;
lx++;
if(b[j]>1) re++;
}
if(lx==5 && re<=2)
{
flag=true;
break;
}
}
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}