德州扑克问题:一副牌中发五张扑克牌给你:让你判断数字的组成:
有以下几种情况:
1:四条:即四张一样数值的牌(牌均不论花色)2:三条带 一对
3:三条带两张不相同数值的牌
4:两对
5:顺子 包括 10,J,Q,K,A
6:什么都不是
7:只有一对
编程实现以上功能。
思路:对发到手里的5张牌先进行升序排序,再判断手牌的情形。
判断牌的情况一般使用的是switch语句和if—else语句,但个人感觉太繁琐,于是想了一个利用字符串比较的办法:排序后的5个数,每2个相邻的数比较大小,则可分为4组,用一个字符串char a[5]表示这4组比较的结果,相等赋’1‘,不等赋’0‘。例如,输入为6,6,6,6,8(排序后)时,a存储的字符串为“1110”;输入为3,3,5,8,11时,a存储的字符串为"1000“……由此可按该思路编程解决问题。
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <time.h>
using namespace std;
void sort(int [],int);
void judge_cards(int []);
int main()
{
int A[5];
vector<int> pile(52,0);
srand(time(NULL));
for (int i = 0; i < pile.size(); ++i)
pile[i] = i + 1;
random_shuffle(pile.begin(),pile.end()); //随机打乱1-52整齐排列的int数组
for (int i = 0; i < 5; ++i) //抽取前5个数作为输入
A[i] = pile[i] % 13 + 1;
cout << "The original cards:";
for (int i = 0; i < 5; ++i)
cout << A[i] << " ";
cout << endl;
sort(A,5);
judge_cards(A);
return 0;
}
void sort(int A[],int len) //选择插入排序法进行排序
{
int i,j,key;
for (i = 0; i < len; ++i)
{
j = i - 1;
key = A[i];
while (key < A[j])
{
A[j+1] = A[j];
--j;
}
A[j+1] = key;
}
}
void judge_cards(int A[]) //相邻的数字两两比较
{
char a[5];
for (int i = 1; i < 5; ++i)
if (A[i] == A[i-1])
a[i-1] = '1';
else
a[i-1] = '0';
a[4] = '\0';
if (!strcmp(a,"0111") || !strcmp(a,"1110"))
cout << "四条:即四张一样数值的牌" << endl;
if (!strcmp(a,"1101") || !strcmp(a,"1011"))
cout << "三条带一对" << endl;
if (!strcmp(a,"1100") || !strcmp(a,"0011") || !strcmp(a,"0110"))
cout << "三条带两张不相同数值的牌" << endl;
if (!strcmp(a,"1010") || !strcmp(a,"0101") || !strcmp(a,"1001"))
cout << "两对" << endl;
if (!strcmp(a,"1000") || !strcmp(a,"0100") || !strcmp(a,"0010") || !strcmp(a,"0001"))
cout << "只有一对" << endl;
if (!strcmp(a,"0000"))
if (A[4] - A[0] == 4 || A[1] - A[0] == 9)
cout << "顺子" << endl;
else
cout << "什么都不是" << endl;
}