IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 大一C语言总结贴(持更) Part 11 同花顺 -> 正文阅读

[C++知识库]大一C语言总结贴(持更) Part 11 同花顺

【问题描述】

编程分析一手5张牌的牌型,输出最好的牌型。每张牌有四种花色(方块Diamonds、梅花Clubs、红桃Hearts、黑桃Spades)和等级(2、3、4、5、6、7、8、9、10、J、Q、K、A),这里A看做最小等级。牌型从大到小有:

?同花顺 Straight Flush(同花色且等级顺序相连)

?四张 Four of A Kind(4张牌等级相同)

?葫芦 Full House(3张牌等级相同,另2张牌也等级相同)

?同花 Flush(5张牌花色相同)

?顺子 Straight(5张牌等级顺序相连)

?三张 Three of A Kind(3张牌等级相同)

?两对 Two Pairs(存在两个对子)

?对子 Pair(2张牌等级相同)

?其他 Other

输入时,花色用首字母表示,等级用数字或字母表示(10用T表示)。

若输入非法牌或重复牌则丢弃。若输入为0则结束程序。


【输入形式】

输入为若干行,每行包括5张牌,每张牌表示为花色+等级的形式,例如:红桃4表示为“H4”,两张牌之间用一个空格隔开,第5张牌之后没有空格

最后一行输入为:0,表示输入结束。
【输出形式】

输出为若干行,每一行输出表示对于一手5张牌(对应输入中的每一行)的分析结果。如果5张牌中包括非法牌(不在52张之中)或含有重复牌,则输出“Invalid”,否则,根据题目中描述的牌型,输出匹配的等级最大的牌型名称。
【样例输入】

DA?C5?S3?H2 D4

H6 D8 DK SA AT

0


【样例输出】

Straight

Invalid

【样例说明】

第一行输入可以组成“方块A 红桃2 黑桃3 方块4 梅花5”的顺子,故第一行输出为“Straight”

第二行输入包含“AT”不属于题目中描述的52张牌,故输出“Invalid”

注:对于同花顺和顺子,本题中假设A为最小等级,故组成顺子时,“A1234”“9TJQK”可以组成顺子,而“TJQKA”不可以组成顺子。

特别提醒!!!本题中每行末尾的换行是“\r\n”因此如果输入按字符读取,请注意行末的“\r\n”对应两个字符!

代码

#include <stdio.h>
int main()
{
	int i, j, k, r, s; /*辅助变量*/ 
	int choosecolor = 0, choosenum = 0, sum_i = 0, judge = 0, select = 0; 
	/*分别定义颜色及点数分类类别 choosecolor,choosenum;
	总行数sum_i;判断输入是否合法的 judge,select */ 
	char color[666][5], num[666][5];
	for (i = 0; ; i++) 
	{
		for (j = 0; j <= 4; j++)
		{
			if (j == 0) 
			{
				scanf("%c", &color[i][0]);
				if (color[i][0] == '0')  
					break;                /*先读入第一个color,若为0直接结束*/
				else 
					scanf("%c ", &num[i][j]);          /*读入第一个数字*/
			}
			else if (j != 4) 
				scanf("%c%c ", &color[i][j], &num[i][j]);
			    else 
				scanf("%c%c\r\n", &color[i][j], &num[i][j]);
			
			
				if (num[i][j] == 65) num[i][j] = 49;	
				if (num[i][j] == 84) num[i][j] = 58;  
				if (num[i][j] == 74) num[i][j] = 59;
				if (num[i][j] == 81) num[i][j] = 60;
				if (num[i][j] == 75) num[i][j] = 61;/*为了后续顺子排序方便,因为2至9对应ASCII码
				为50至57,将A,T,J,Q,K分别进行转化为49,58,59,60,61*/
				if ((num[i][j] <= 49 || num[i][j] >= 58) && (num[i][j] != 84 
				    && num[i][j] != 74&& num[i][j] != 81 && num[i][j] != 75 
					&& num[i][j] != 65))
					select = 1; /*去掉A至K以外的非法牌*/ 
					
					 
		} 
		if (color[i][0] == '0') break;    /*读到0直接结束*/
	}
	sum_i = i - 1;
	
    for (k = 0; k <= sum_i; k++)  
	{
	    for (r = 0; r <= 4; r++)
		{	
		    if ( (color[k][r] != 67) && (color[k][r] != 68) 
				&& (color[k][r] != 72) && (color[k][r] != 83) ) 
			{ 
				judge = 1; 
			} 
		    for (s = r + 1; s <= 4; s++)  
			    if ( (color[k][s] == color[k][r]) && (num[k][s] == num[k][r]) ) 
			    { 
					judge = 1;
				} 
			if (judge == 1)
			break;
		}

		void sort(int comp[5]);  /*引用函数*/  
		int a[5] = {color[k][0], color[k][1], color[k][2], color[k][3], color[k][4]};
		int b[5] = {num[k][0], num[k][1], num[k][2], num[k][3], num[k][4]};
        sort(a);
        sort(b);
			
		if (a[0]== a[4])
		choosecolor = 1; /*同花(因为按顺序排好,首尾相等即可)*/
		
			
		if (b[0] == b[1] + 1 && b[1] == b[2] + 1 
			&& b[2] == b[3] + 1 && b[3] == b[4] + 1)
			choosenum = 1; 
			                    /*顺子*/
		else if ((b[0] == b[3]) || (b[1] == b[4]))
			choosenum = 2;    
			               /*四张 (因为按顺序排好,首尾相等即可)*/
		else if ( ( (b[0] == b[2]) && (b[3] == b[4]) ) 
			    || ( (b[2] == b[4]) && (b[0] == b[1]) ) )
			choosenum = 3;                      
							 /*葫芦*/
		else if ( (b[0] == b[2]) || (b[1] == b[3]) || (b[2] == b[4]) )
			choosenum = 4;                   	
								 /*三张*/
		else if ( (b[0] == b[1] && b[2] == b[3]) 
				|| (b[0] == b[1] && b[3] == b[4]) 
			    || (b[1] == b[2] && b[3] == b[4]) ) 
		  	choosenum = 5;
		  						/*两对*/	
		else if ((b[0] == b[1]) || (b[1] == b[2]) 
				|| (b[2] == b[3]) || (b[3] == b[4]))
			    choosenum = 6;
			    				/*对子*/
		
			
		{
			if (judge == 1 || (select == 1) )
				printf("Invalid\n");
			else if (choosecolor == 1 && choosenum == 1) 
				printf("Straight Flush\n");
			else if (choosenum == 2) 
				printf("Four of A Kind\n");
			else if (choosenum == 3) 
				printf("Full House\n");
			else if (choosecolor == 1) 
				printf("Flush\n");
			else if (choosenum == 1) 
				printf("Straight\n");
			else if (choosenum == 4) 
				printf("Three of A Kind\n");
			else if (choosenum == 5) 
				printf("Two Pairs\n");
			else if (choosenum == 6) 
				printf("Pair\n");
			else printf("Other\n");
		}
	} 								/*输出*/
    return 0;
}

void sort(int comp[5])  // 设计一个将数字顺序排列的函数 
{
	int i, j, t = 0;
	for (i = 0; i < 4; i++)
	{
		for (j = i + 1; j < 5; j++)
		{
			if(comp[j] > comp[i])
			{
				t = comp[i]; 
				comp[i] = comp[j];
				comp[j] = t;  //冒泡法获得降序排列的值 
			}
		}
	}
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-24 15:05:50  更:2022-02-24 15:06:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:01:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码