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

扑克牌的顺子
从扑克牌中随机抽 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!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值