69. 斗地主之顺子
题目描述
在斗地主扑克牌游戏中,扑克牌由小到大的顺序为:3.4.5.6.7.8.9.10.J.Q.KA.2,玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。
其中顺子的出牌规则为:由至少5张由小到大连续递增的扑克牌组成,且不能包含2.例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;而{J,Q,K,A,2}、{2,3,4,5,6}、{3,4,5,6}.{3,4,5,6,8}等都不是顺子。
给定一个包含13张牌的数组,如果有满足出牌规则的顺子,请输出顺子,如果存在多个顺子,请每行输出一个顺子,且需要按顺子的第一张牌的大小(必须从小到大)依次输出。
如果没有满足出牌规则的顺子,请输出No。
输入描述
13张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王 2 9 J 2 3 4 K A 7 9 A 5 6
不需要考虑输入为异常字符的情况
输出描述
组成的顺子,每张扑克牌数字用空格隔开
3 4 5 6 7
用例
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.在斗地主扑克牌游戏中,扑克牌由小到大的顺序为:3.4.5.6.7.8.9.10.J.Q.K.A.2
2.玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。
3.其中顺子的出牌规则为:由至少5张由小到大连续递增的扑克牌组成,且不能包含2.
例如:3 4 5 6 7、3 4 5 6 7 8 9 10 J Q K A、而J Q K A 2、2 3 4 5 6、3 4 5 6、3 4 5 6 8等都不是顺子
4.给定一个包含13张牌的数组,如果有满足出牌规则的顺子,请输出顺子,如果存在多个顺子,请每行输出一个顺子,且需要按顺子的第一张牌的大小(必须从小到大)依次输出。
5.如果没有满足出牌规则的顺子,请输出No。
6.输入描述:13张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王2 9 J 2 3 4 K A 7 9 A 5 6
不需要考虑输入为异常字符串的情况。
7.输出描述:组成的顺子,每张扑克牌数字用空格隔开。
3 4 5 6 7
二、解题思路
1.首先接收数据,将所有非数字的变成数字存储
2.然后对数组排序,然后遍历数组,如果有连续5个以上的数字是递增的数字那么记录下来
3.最后输出顺子
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int compare(const void* a, const void* b) {
int* intA = (int*)a;
int* intB = (int*)b;
return *intA - *intB;
}
int main() {
char p[] = {'J', 'Q', 'K', 'A'};
int n[] = {11, 12, 13, 14};
char poker[13][2];
int pokerNum[13];
for(int i = 0; i < 13; i++) {
scanf("%s", poker[i]);
// printf("poker[%d]:%s\n", i, poker[i]);
}
for(int i = 0; i < 13; i++) {
if(strlen(poker[i]) == 1) {
if(isdigit(poker[i][0])) {
pokerNum[i] = poker[i][0] - '0';
} else {
for(int j = 0; j < 4; j++) {
if(poker[i][0] == p[j]) {
pokerNum[i] = n[j];
}
}
}
} else {
if(poker[i][0] == '1' && poker[i][1] == '0') {
pokerNum[i] = 10;
}
}
}
for(int i = 0; i < 13; i++) {
// printf("pokerNum:%d\n", pokerNum[i]);
}
int answer[2][2] = {0};
qsort(pokerNum, 13, sizeof(int), compare);
for(int i = 0; i < 13; i++) {
// printf("pokerNum:%d\n", pokerNum[i]);
}
int answerIdx = 0;
for(int i = 0; i < 13; i++) {
if(pokerNum[i] != 2 && i + 1 < 13 && pokerNum[i] == pokerNum[i + 1] - 1) {
answer[answerIdx][0] = pokerNum[i];
while(i + 1 < 13 && pokerNum[i] == pokerNum[i + 1] - 1) {
i++;
}
// printf("pokerNum[i] - answer[answerIdx][0] is %d - %d\n", pokerNum[i], answer[answerIdx][0]);
if(pokerNum[i] - answer[answerIdx][0] > 3) {
answer[answerIdx][1] = pokerNum[i];
answerIdx++;
}
}
}
for(int i = 0; i < answerIdx; i++) {
for(int j = answer[i][0]; j <= answer[i][1]; j++) {
if(j <= 10) {
printf("%d", j);
} else {
for(int k = 0; k < 4; k++) {
if(j == n[k]) {
printf("%c", p[k]);
}
}
}
if(j != answer[i][1]) {
printf(" ");
}
}
printf("\n");
}
if(answerIdx == 0) printf("No\n");
return 0;
}
原文地址:https://blog.csdn.net/bingw0114/article/details/143883785
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!