![](https://i-blog.csdnimg.cn/blog_migrate/05b8f439e2f6e8854a6ed37806ff8841.png)
题目
解决代码及点评
/*
从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的。2-10
为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意数字。
解法,通过选择排序,将5张牌排序,再判断是否相邻为1,对王进行一些额外判断即可
*/
#include <iostream>
using namespace std;
void SelectSort(int *pnArr, int nLen)
{
for (int i = 0; i < nLen; i++)
{
int nMinPos = i;
for (int j = i+1; j < nLen; j++)
{
if (pnArr[j] < pnArr[nMinPos])
{
nMinPos = j;
}
}
if (nMinPos != i)
{
swap(pnArr[i], pnArr[nMinPos]);
}
}
}
bool IsSq(int *pnArr, int nLen)
{
//将A J Q K 大小王转换为数字
int i;
int nZero = 0;
for (i = 0; i < nLen; i++)
{
switch(pnArr[i]) {
case 'A':
pnArr[i] = 1;
break;
case 'J':
pnArr[i] = 11;
break;
case 'Q':
pnArr[i] = 12;
break;
case 'K':
pnArr[i] = 13;
break;
case 0:
nZero++;
break;
}
}
//从小到大排序
SelectSort(pnArr, nLen);
int k = 0; //统计排序之后的数组非0相邻数字之间的空缺总数
for (i = nLen - 1; i > nZero; i--)
{
// 如果有相等的牌,那就完蛋了,直接返回false吧
if (pnArr[i] == pnArr[i-1])
{
return false;
}
// 累加相邻的牌
else
{
k += pnArr[i] - pnArr[i-1] - 1;
}
}
// 如果相邻空缺小于王的数量,则是顺子,否则不是
if (k <= nZero)
{
return true;
}
else
{
return false;
}
}
int main()
{
//大小王都用0表示
int nArr[5] = {'J',0,'Q','K',9};
if(IsSq(nArr, 5))
{
cout<<"顺子"<<endl;
}
else
{
cout<<"非顺子"<<endl;
}
system("pause");
return 0;
}
代码下载及其运行
代码下载地址:http://download.csdn.net/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果