小米oj
德州扑克
描述
德州扑克是风靡全球的一种扑克游戏。扑克有四种花色,分别为黑桃(S)、红桃(H)、梅花(C)、方片(D)。每种花色有13张牌,从小到大分别为2、3、4、5、6、7、8、9、10、J、Q、K、A。
考虑德州扑克中的如下三种牌形: 同花顺(Straight Flush):同一花色,并且连续的五张牌。 例如:{SK SQ SJ S10 S9} 对于连续的五张牌,有一个特例,即 {A、2、3、4、5} 也算作连续的五张牌。但 {K、A、2、3、4},{Q、K、A、2、3},{J、Q、K、A、2} 不算作连续的五张牌。
同花(Flush):同一花色但不连续的五张牌。 例如:{H10 H7 H4 H3 H2}
顺子(Straight):连续但不是同一花色的五张牌。 例如:{SA H2 D3 C4 D5}
这三种牌形的大小关系是:顺子 < 同花 < 同花顺。 现在,我们为了游戏的趣味性,在扑克中加入了5张魔术牌(用M表示),你可以将每张魔术牌变成你想要的任何一张牌。 你从牌堆里随机抽了五张牌,请你给出最大可能的牌形。如果三种牌形都无法组成,请输出GG。
输入
一行字符串,表示使用空格分隔的五张牌,每张牌由花色与点数组成(或使用M来表示魔术牌)。
输出
单组输入。 一行字符串,表示能够组成的最大牌形。 只有Flush、Straight、Straight Flush、GG四种结果。
这个题和昨天做的那个扑克游戏类似,难度稍微低一些,不用比较两副牌的大小,虽然增加了花色和癞子。。。。有了上回的530行的坑,这回的读取相对就比较的容易了。
while (~scanf("%c", &a))
{
if (a == 'p')//p作为输出结束标志 最后提交没有这一项
break;
if (a == ' ');
else
{
if (a == 'S')
{
b[i] = 1;
i++;
scanf("%c", &a);
if (a == '1')
{
scanf("%c", &a);//在看下一个a是多少
if (a == '0')
h = 10;
else if (a == ' ')
h = 1;
}
else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
else if (a == 'K')h = 13; else if (a == 'A')h = 14;
d[j] = h;
j++;
}
else if (a == 'H')
{
b[i] = 2;
i++;
scanf("%c", &a);
if (a == '1')
{
scanf("%c", &a);//在看下一个a是多少
if (a == '0')
h = 10;
else if (a == ' ')
h = 1;
}
else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
else if (a == 'K')h = 13; else if (a == 'A')h = 14;
d[j] = h;
j++;
}
else if (a == 'C')
{
b[i] = 3;
i++;
scanf("%c", &a);
if (a == '1')
{
scanf("%c", &a);//在看下一个a是多少
if (a == '0')
h = 10;
else if (a == ' ')
h = 1;
}
else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
else if (a == 'K')h = 13; else if (a == 'A')h = 14;
d[j] = h;
j++;
}
else if (a == 'D')
{
b[i] = 4;
i++;
scanf("%c", &a);
if (a == '1')
{
scanf("%c", &a);//在看下一个a是多少
if (a == '0')
h = 10;
else if (a == ' ')
h = 1;
}
else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
else if (a == 'K')h = 13; else if (a == 'A')h = 14;
d[j] = h;
j++;
}
else if (a == 'M')
{
b[i] = 5;
i++;
d[j] = 0;
j++;
}
}
}
…然后所有的花色被存入了b这个数组里面 我把SHCD 映射成1 2 3 4把癞子 M映射到5.然后我把牌的点数大小放在了d这个数组里。2-14然后。。。。。开始写程序。。。。。。 上午。。。。写了一个多小时。。。(此时的我比较菜。。。。)然后写好了。。贴下代码
#include <stdio.h>
#include "stdlib.h"
int compare(const void *a, const void *b);//排序比较函数
int compare(const void *a, const void *b)
{
return *(int*)b - *(int*)a; //降序排列
}
int main()
{
static int b[5], d[5];//用来存放字母和数字的数组
static int i, j, k, h;
static char a;
while (~scanf("%c", &a))
{
if (a == 'p')//p作为输出结束标志 最后提交没有这一项
break;
if (a == ' ');
else
{
if (a == 'S')
{
b[i] = 1;
i++;
scanf("%c", &a);
if (a == '1')
{
scanf("%c", &a);//在看下一个a是多少
if (a == '0')
h = 10;
else if (a == ' ')
h = 1;
}
else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
else if (a == 'K')h = 13; else if (a == 'A')h = 14;
d[j] = h;
j++;
}
else if (a == 'H')
{
b[i] = 2;
i++;
scanf("%c", &a);
if (a == '1')
{
scanf("%c", &a);//在看下一个a是多少
if (a == '0')
h = 10;
else if (a == ' ')
h = 1;
}
else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
else if (a == 'K')h = 13; else if (a == 'A')h = 14;
d[j] = h;
j++;
}
else if (a == 'C')
{
b[i] = 3;
i++;
scanf("%c", &a);
if (a == '1')
{
scanf("%c", &a);//在看下一个a是多少
if (a == '0')
h = 10;
else if (a == ' ')
h = 1;
}
else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
else if (a == 'K')h = 13; else if (a == 'A')h = 14;
d[j] = h;
j++;
}
else if (a == 'D')
{
b[i] = 4;
i++;
scanf("%c", &a);
if (a == '1')
{
scanf("%c", &a);//在看下一个a是多少
if (a == '0')
h = 10;
else if (a == ' ')
h = 1;
}
else if (a == '2')h = 2; else if (a == '3')h = 3; else if (a == '4')h = 4;
else if (a == '5')h = 5; else if (a == '6')h = 6; else if (a == '7')h = 7;
else if (a == '8')h = 8; else if (a == '9')h = 9; else if (a == 'J')h = 11; else if (a == 'Q')h = 12;
else if (a == 'K')h = 13; else if (a == 'A')h = 14;
d[j] = h;
j++;
}
else if (a == 'M')
{
b[i] = 5;
i++;
d[j] = 0;
j++;
}
}
}
/*排序函数给b d 排序*/
int length = sizeof(b) / sizeof(int);
int length1 = sizeof(d) / sizeof(int);
qsort(b, length, sizeof(int), compare);
qsort(d, length1, sizeof(int), compare);
//printf("%d %d %d %d %d %d %d %d\n", b[0], b[1], b[2], b[3], d[0], d[1], d[2], d[3]);
int flag1=2, flag2=2,count=0;//同花和顺子
if (
((b[0] == 5 || b[0] == 1) && (b[4] == 5 || b[4] == 1) && (b[1] == 5 || b[1] == 1) && (b[2] == 5 || b[2] == 1) && (b[3] == 5 || b[3] == 1)) ||
((b[0] == 5 || b[0] == 2) && (b[4] == 5 || b[4] == 2) && (b[1] == 5 || b[1] == 2) && (b[2] == 5 || b[2] == 2) && (b[3] == 5 || b[3] == 2)) ||
((b[0] == 5 || b[0] == 3) && (b[4] == 5 || b[4] == 3) && (b[1] == 5 || b[1] == 3) && (b[2] == 5 || b[2] == 3) && (b[3] == 5 || b[3] == 3)) ||
((b[0] == 5 || b[0] == 4) && (b[4] == 5 || b[4] == 4) && (b[1] == 5 || b[1] == 4) && (b[2] == 5 || b[2] == 4) && (b[3] == 5 || b[3] == 4))
)
{
flag1 = 1;
}
/*算有多少个M*/
for (i = 0; i < 5; i++)
{
if (d[i] == 0)
count++;
}
//如果有对子直接不是顺子
for (i = 0; i < 5; i++)
{
if (d[i] == d[i + 1]&&d[i]!=0)
flag2 = 0;
}
if (flag2 == 0)
;
else
{
for (i = 0, j = 0; i < 5; i++)
{
if (d[i] == 14 || d[i] <= 5)
j++;
}
if (d[0] - d[4 - count] <= 4)//顺子
flag2 = 1;
else if (j == 5)
{
flag2 = 1;
}
else
{
flag2 = 0;
}
}
if (flag1 == 1 && flag2 == 1)
{
printf("Straight Flush");
}
else if (flag1 == 1 && flag2 != 1)
{
printf("Flush");
}
else if (flag1 != 1 && flag2 == 1)
{
printf("Straight");
}
else
{
printf("GG");
}
//printf("%d %d \n", flag1, flag2);
return 0;
}
然后估计又是没啥人用c…结果。。。