判断5张扑克牌的组成

一副牌中发五张扑克牌给你,让你判断数字的组成:

有以下几种情况:

1:四条:即四张一样数值的牌(牌均不论花色)

2:三条带一对

3:三条带两张不相同数值的牌

4:两对

5:顺子(包括10,J,Q,K,A)

6:什么都不是

7:只有一对

分析:

应该不包含大小王,另外J、Q、K、A分别相当于11、12、13、14,虽然从2到A一共是13张牌,但是为了方便对应,使用了一个包含15个元素的数组来记录每一个点数出现的次数(舍弃0号元素和1号元素)。

为了记录发给你的5张牌,直接用整型肯定不行,不能接受J、Q、K、A的输入,刚开始的时候准备使用一个字符数组接受输入,然后再转换为整型,但是字符输入是不能接受10这样的输入的,最后只能使用字符串数组接受输入。

C代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define LEN 5
#define TOTAL_LEN 15 

char str_poker[LEN][3];
int int_poker[LEN] = {0};
int total_poker[TOTAL_LEN] = {0};

void check(int len, int poker[]);
void ch_to_int(int len, char str_array[][3], int int_array[]);
void int_sort(int len, int a[]);

int main()
{
	int i;
	printf("please input your cards:");
	for(i=0; i<LEN; i++)
		scanf("%s",str_poker[i]);
	ch_to_int(LEN, str_poker, int_poker);
	printf("the result is:");
	check(LEN, int_poker);
	return 0;
}

void ch_to_int(int len, char str_array[][3], int int_array[])
{
	int i;
	for(i=0; i<LEN; i++)
	{
		if(strcmp(str_array[i],"10") == 0)
		{
			int_array[i] = 10;
			continue;
		}
		if(strcmp(str_array[i],"J") == 0)
		{
			int_array[i] = 11;
			continue;
		}
		if(strcmp(str_array[i],"Q") == 0)
		{
			int_array[i] = 12;
			continue;
		}
		if(strcmp(str_array[i],"K") == 0)
		{
			int_array[i] = 13;
			continue;
		}
		if(strcmp(str_array[i],"A") == 0)
		{
			int_array[i] = 14;
			continue;
		}
		int_array[i] = atoi(str_array[i]);
	}
}

void int_sort(int len, int a[])
{
	int i,j,temp;
	for(i=0; i<len-1; i++)
		for(j=0; j<len-1; j++)
			if(a[j] > a[j+1])
			{
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
}

void check(int len, int poker[])
{
	int i;
	int res = 1;
	for(i=0; i<LEN; i++)
		total_poker[poker[i]]++;
	for(i=1; i<=TOTAL_LEN; i++)
	{
		if(total_poker[i] == 4)
		{
			printf("四条加一张\n");
			return;
		}
		if(total_poker[i] >= 2)
			res *= total_poker[i];
	}
	if(res > 1)
	{
		switch(res)
		{
		case 2:
			printf("一对加三张不同\n");
			break;
		case 3:
			printf("三条加两张不同\n");
			break;
		case 4:
			printf("两队加一张\n");
			break;
		case 6:
			printf("三条加一对\n");
			break;
		}
	}
	else
	{
		int_sort(LEN, poker);
		for(i=0; i<LEN-1; i++)
		{
			if(poker[i+1] != poker[i] + 1)
			{
				printf("什么都不是\n");
				return;
			}
		}
		printf("五张顺子\n");
	}
}

几组测试用例如下:

判断5张扑克牌的组成

时间: 2024-10-13 08:37:08

判断5张扑克牌的组成的相关文章

华为机试—5张扑克牌的组成

一副牌中发五张扑克牌给你:让你判断数字的组成: 有以下几种情况: 1:四条:即四张一样数值的牌(牌均不论花色) 2:三条带 一对 3:三条带两张不相同数值的牌 4:两对 5:顺子 包括 10,J,Q,K,A 6:什么都不是 7:只有一对. c #include<iostream> #include<string> #include<cstdlib> using namespace std; int cmp(const void *a,const void *b) { r

推断5张扑克牌的组成

一副牌中发五张扑克牌给你,让你推断数字的组成: 有下面几种情况: 1:四条:即四张一样数值的牌(牌均不论花色) 2:三条带一对 3:三条带两张不同样数值的牌 4:两对 5:顺子(包含10,J,Q,K,A) 6:什么都不是 7:仅仅有一对 分析: 应该不包括大小王,另外J.Q.K.A分别相当于11.12.13.14,尽管从2到A一共是13张牌.可是为了方便相应,使用了一个包括15个元素的数组来记录每个点数出现的次数(舍弃0号元素和1号元素). 为了记录发给你的5张牌.直接用整型肯定不行,不能接受J

Java 用LinkdeList实现52张扑克牌

用LinkdeList实现52张扑克牌(不含大小王)的洗牌功能.提示:花色 ,和数字分别用数组存储. import java.util.LinkedList; import java.util.Random; class Poker{ String color;//花色 String num;//数字 public Poker(String color,String num){ this.color = color; this.num = num; } @Override public Stri

【猜牌问题】甲乙都知道桌子的抽屉里有16张扑克牌: 红桃A、Q、4 黑桃J、8、4、2、7、3 草色K、Q、5、4、6 方块A、5 教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉甲,把这张牌的花色告诉乙。教授问:你们能推理出是什么牌吗? 甲:我不知道这张牌。 乙:我知道你不知道这张牌。 甲:现在我知道这张牌了。 乙:我也知道了。 请问:这张牌是什么牌?

甲乙都知道桌子的抽屉里有16张扑克牌: 红桃A.Q.4 黑桃J.8.4.2.7.3 草色K.Q.5.4.6 方块A.5 教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉甲,把这张牌的花色告诉乙.教授问:你们能推理出是什么牌吗? 甲:我不知道这张牌.乙:我知道你不知道这张牌.甲:现在我知道这张牌了.乙:我也知道了. 请问:这张牌是什么牌? 解: 教授告知甲点数,告知乙花色 人物 已知 未知 甲 A 红桃.方块 Q 红桃.草色 4 红桃.黑桃.草色 J 黑桃 8 黑桃 2 黑桃 7 黑桃 3 黑

理解面向对象编程---C#控制台实现52张扑克牌的分法

52张牌随机分给4个玩家,要求每个玩家的牌用一个一维数组表示. 我们采用模拟大法.初始化一副扑克牌,洗牌,发牌. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication43 { class Program { enum Suit { Spade, Heart, Di

给定N张扑克牌,设计一个洗牌算法

均匀洗牌即可 方法1: #include<stdio.h> #include<stdlib.h> #include<time.h> static int num = 54;//num为纸牌数目 //随机数发生器,产生[n,m)之间的随机数 int getRandNum(int n,int m) { if(n==m) { return n; } else if(n>m) { return -1; } time_t time1; srand(( unsigned in

[抽象建模问题]扑克牌的顺子判断

根据抽到的5张扑克牌,判断是不是顺子.注意:大小王可以随便的代替任何的牌. bool IsContinuous( vector<int> numbers ) { int i = 0; int length = numbers.size(); if(length <= 0) { return false; } int *arr = &numbers[0]; qsort(arr, length, sizeof(int), compare); //统计0的个数 int numberOf

基于AForge.Net框架的扑克牌识别

原文:基于AForge.Net框架的扑克牌识别 © 版权所有 野比 2012 原文地址:点击查看 作者:Nazmi Altun Nazmi Altun著,野比 译  下载源代码 - 148.61 KB  下载demo - 3.1 MB 介绍 (图片上的字:方块4,方块J,黑桃2) 用机器人配上扑克牌识别系统,就可以在二十一点一类的扑克游戏中扮演荷官或是人类玩家的角色.实现这样的程序同样也是学习计算机视觉和模式识别的好途径. 本文涉及到的AForge.NET框架技术有二值化.边缘检测.仿射变换.B

扑克牌的问题

问题描述: 假设有A和B来两个人玩牌.游戏的规则是这样的:将一副牌均分成两份,每人拿一份.A先拿出手中的第一张扑克牌,放在桌上,然后B也拿出手中的第一张扑克牌,放在A刚打出来的扑克牌的上面,就这样两人交替出牌.出牌时,如果某人打出的牌与桌上的某张牌的牌面相同,即可将两种牌以及其中间的所有牌全部取走,并按照从上到下的顺序依次放到自己手中牌的末尾.当任意一人手中的牌全部取完时,游戏结束,对手获胜. 先假设A手上有牌,按顺序依次为:2 4 1 2 5 6,B手上有牌顺序为:3 1 3 5 6 4.写程