扑克牌的顺子
从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的。
从扑克牌中随机抽 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 gui
int 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 gui
continue;
}
if(input[i]<minIdx)
minIdx = input[i];
if(input[i]>maxIdx)
maxIdx = input[i];
a[input[i]]=1;
}
//find the continue
count=1;
//区分应该从后面开始还是前面
bool nor_flag = true;
if(13-minIdx<5){
i=maxIdx-1;
nor_flag = false;
}
else
i = minIdx+1;
while(count!=5){
if(nor_flag && i>=13)
break;
if(!nor_flag && i<0)
break;
if(a[i] == 0){
//look for gui
if(guiNum>0){
guiNum--;
i = nor_flag?i+1:i-1;
count++;
continue;
}else
break;
}
count++;
i = nor_flag?i+1:i-1;
}
//judge
if(count<5)
cout<<"no continue!!"<<endl;
else
cout<<"continue!!"<<endl;
return 0;
}
11 12 7 8 3
no continue!!
11 9 8 7 10
continue!!