/*
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数
字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。
*/
/*
Author: Unimen
Date: 26/09/2011 07:23
Description: 数组问题
*/
/*
解题报告:
1、把王看成数字0
2、对所有数字排序,看其中连续数字的空缺数,与0的个数进行比较,当小于等于0的个数时
就是连续的,即顺子
3、要注意除去了0以后,数字当中是否有重复的
注意:
按着上面的思路来,但不一定非得排序、查找重复数字,用些其他的办法,降低代码的编写难度
*/
#include <iostream>
#include <set>
#include <vector>
using namespace std;
void GetMaxMin(const set<int> &setNum, int &nMax, int &nMin)
{
nMin = 13;
nMax = 1;
set<int>::const_iterator iter = setNum.begin();
for (; iter!=setNum.end(); ++iter)
{
if (*iter <nMin)
{
nMin = *iter;
}
if (*iter > nMax)
{
nMax = *iter;
}
}
}
int Del0Num(set<int> &setNum, const vector<int> &data)
{
int Num0 = 0;
vector<int>::const_iterator iter = data.begin();
for (; iter!=data.end(); ++iter)
{
if (*iter != 0)
{
setNum.insert(*iter);
}
else
{
Num0++;
}
}
return Num0;
}
bool IsContinuous(vector<int> data)
{
int nMax = 0, nMin = 0;
set<int> setNum;
int num0 = Del0Num(setNum, data);
//如果其中存在对子,即除了0外有两个数字是重复的
if (num0 + setNum.size() < data.size())
{
return false;
}
GetMaxMin(setNum, nMax, nMin);
return nMax - nMin <= data.size() - 1; //数学方法
}
int main()
{
vector<int> vec;
int n;
while (cin>>n)
{
for (int i=0; i<n; ++i)
{
int nTemp;
cin>>nTemp;
vec.push_back(nTemp);
}
cout<<IsContinuous(vec)<<endl;
}
return 0;
}
扑克牌的顺子
最新推荐文章于 2023-12-08 17:27:40 发布