题目
解决代码及点评
/* 从扑克牌中随机抽 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调试器”运行
程序运行结果