题目
思路
大小王用0表示,其他为对应数字。
排序 + 计算两数的差值 + 与0的个数比较,确定是否为顺子。
代码
#include <iostream>
#include <algorithm>
#include <assert.h>
using namespace std;
bool IsSequence(int nArr[],int n)
{
assert(nArr && n > 0);
int nZeroCount = 0;
int nCur = 0;
int nDiff = 0;
//排序
sort(nArr,nArr + n);
for (int i = 0;i < n;i++)
{
cout<<nArr[i]<<" ";
}
cout<<endl;
//统计0的个数
while(nCur < n && nArr[nCur] == 0)
{
nZeroCount++;
nCur++;
}
//处理数据
while(nCur < n - 1)
{
nDiff = nArr[nCur + 1] - nArr[nCur] - 1;
if (nDiff == -1)//两数相等不可能为顺子,直接返回
{
return false;
}
if (nDiff > nZeroCount)
{
return false;
}
else
{
nZeroCount -= nDiff;
}
nCur++;
}
return true;
}
int main()
{
// int nLen = 5;
// int nArr[5] = {1,3,0,0,5};
int nLen = 5;
int nArr[5] = {10,13,0,0,8};
//int nLen = 5;
//int nArr[5] = {10,10,0,0,0};
// int nLen = 5;
// int nArr[5] = {5,4,2,3,1};
if (IsSequence(nArr,nLen))
{
cout<<"顺子!"<<endl;
}
else
{
cout<<"不是顺子!"<<endl;
}
system("pause");
return 1;
}
本文介绍了一种通过排序和计算数值差来判断一组含有大小王的扑克牌是否能组成顺子的算法。该算法首先将牌面值进行排序,并统计大小王(用0表示)的数量,接着通过计算相邻两张牌之间的差值来判断是否能通过调整大小王的位置形成连续的顺子。
4044

被折叠的 条评论
为什么被折叠?



