算法习题67(1):扑克牌顺子游戏

来源:互联网 发布:统计与自然语言java 编辑:程序博客网 时间:2024/04/29 16:50
扑克牌的顺子
从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的。

2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意数字。

-----------------------------------

炸一看,这题并不难,不过仔细想想,该如何表示这个结构呢?

一开始,想尝试用链表,把牌数字按顺序排序好,如果是司令则记录司令的牌数,遍历数据链表,如果前后差==0,则error退出,

如果前后差==1,指针后移,如果前后差>1,则判断司令数<=0则error退出,否则司令牌数--,同时加入一个司令替换的牌到链表,再次比较前后差,这样可以找到最后的结果。


先麻烦,想直接用数组来完成,这里先定义一个数组,a[13]把抽到的牌对应a[i]置为1,然后找到最大和最小位置,

假设从最小位置开始向后找,同理如果出现不连续的,利用司令来解决,解决不了退出

当然也可以从最大位置向前找,

可是,如果出现

J Q K 司令 司令  从前向后找会发现找不到,从后向前找是可以的

所以这里需要判断下最小元素是否和13差小于5了

逻辑清楚了,接下来就是牌和数字的对应,我这里假设0-12 对应A 2 3.. J Q K    13 14代表正鬼负鬼

我这里就只从这些里去,不是一副牌

//============================================================================// Name        : PlayCard.cpp// Author      : YLF// Version     :// Copyright   : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================#include <iostream>//#include <random>#include <stdlib.h>#include <time.h>using namespace std;int main() {srand((unsigned int)time(NULL));int input[5];int i = 0;for(i=0;i<5;i++){input[i] = (int)(1.0*rand()/RAND_MAX*14);cout<<input[i]<<" ";}cout<<endl;//input 0-12 means A-K  13 14 means the guiint a[13]={0}, count = 0, guiNum = 0 , minIdx=13, maxIdx = 0;for(i=0;i<5;i++){if(input[i] >= 13){guiNum++;//count for the guicontinue;}if(input[i]<minIdx)minIdx = input[i];if(input[i]>maxIdx)maxIdx = input[i];a[input[i]]=1;}//find the continuecount=1;//区分应该从后面开始还是前面bool nor_flag = true;if(13-minIdx<5){i=maxIdx-1;nor_flag = false;}elsei = minIdx+1;while(count!=5){if(nor_flag && i>=13)break;if(!nor_flag && i<0)break;if(a[i] == 0){//look for guiif(guiNum>0){guiNum--;i = nor_flag?i+1:i-1;count++;continue;}elsebreak;}count++;i = nor_flag?i+1:i-1;}//judgeif(count<5)cout<<"no continue!!"<<endl;elsecout<<"continue!!"<<endl;return 0;}

11 12 7 8 3 no continue!!

11 9 8 7 10 continue!!