【问题描述】
编程分析一手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>
#include<stdlib.h>
void bubblesort(int comp[5]);
int main()
{
int i, j, k, r, s; /*辅助变量*/
int choosecolor, choosenum, sum_i = 0, judge, 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] == 'A') num[i][j] = 49;
if (num[i][j] == 'T') num[i][j] = 58;
if (num[i][j] == 'J') num[i][j] = 59;
if (num[i][j] == 'Q') num[i][j] = 60;
if (num[i][j] == 'K') 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] > 61) )
select = 1; /*去掉A至K以外的非法牌*/
}
if (color[i][0] == '0') break; /*读到0直接结束*/
}
sum_i = i - 1;
for (k = 0; k <= sum_i; k++)
{
choosecolor = 0;
choosenum = 0;
judge = 0;
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 bubblesort(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]};
bubblesort(a);
bubblesort(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");
}
} /*输出*/
system("pause");
return 0;
}
void bubblesort(int comp[5]) /* 设计一个将数字顺序排列的函数*/
{
int i, j, temp=0;
for (i = 0; i < 5; i++)
{
for (j = i + 1; j < 5; j++)
{
if(comp[i] > comp[j])
{
temp = comp[i];
comp[i] = comp[j];
comp[j] = temp; /*冒泡法获得升序排列的值*/
}
}
}
}