自学内容网 自学内容网

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)!