小米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…結果。。。