斗地主之顺子问题

题目描述

争上游是一种扑克游戏,其中“顺子”是一种出牌,可以至少脱手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;
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值