首页 > 其他分享 >斗地主之顺子

斗地主之顺子

时间:2024-11-14 11:19:35浏览次数:1  
标签:10 扑克牌 int 斗地主 char 顺子 card

在斗地主扑克牌游戏中, 扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,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
输入
2 9 J 2 3 4 K A 7 9 A 5 6
1
输出
3 4 5 6 7
1
说明

13张牌中,可以组成的顺子只有1组:3 4 5 6 7。

示例2
输入:

2 9 J 10 3 4 K A 7 Q A 5 6
1
输出:

3 4 5 6 7
9 10 J Q K A
12
说明
13张牌中,可以组成2组顺子,从小到大分别为:3 4 5 6 7 和 9 10 J Q K A

示例3
输入:
2 9 9 9 3 4 K A 10 Q A 5 6
1
输出:
No
1
说明
13张牌中,无法组成顺子。

解题思路
这个问题涉及解析一个包含13张扑克牌的数组,目的是识别出所有符合条件的有效顺子。顺子定义为至少包含5张按牌面大小顺序连续的扑克牌,不包括牌面为“2”的牌。
题目描述存在不明确之处,未具体说明是要求解最多数量的顺子,还是单个最长的顺子。

考虑以下示例:
4 5 6 7 8 6 7 8 9 10
1
如果目标是找到数量最多的顺子,答案将是两个独立的顺子:【4 5 6 7 8】和【6 7 8 9 10】。
如果目标是找到单个最长的顺子,答案则是【4 5 6 7 8 9 10】。
此外,如果【数量最多的顺子】,尽管【5 6 7 8 9】也是一个有效顺子,但在按照第二个示例的选择规则,它不是答案。这表明题目可能更倾向于寻找最长的顺子,且实际机考按照最长的去找,通过率高于数量最多。

点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义扑克牌与其数值的映射关系结构体
typedef struct {
    char card[3];  // 扑克牌面(考虑到"10"有两个字符,所以数组大小为3)
    int value;     // 对应的数值
} CardMap;

// 扑克牌面到数值的映射表
CardMap card_to_number[] = {
    {"3", 3}, {"4", 4}, {"5", 5}, {"6", 6}, {"7", 7}, {"8", 8}, {"9", 9}, 
    {"10", 10}, {"J", 11}, {"Q", 12}, {"K", 13}, {"A", 14}, {"2", 16}
};
int card_map_size = sizeof(card_to_number) / sizeof(card_to_number[0]);

// 用于比较扑克牌的函数
int compare_cards(const void *a, const void *b) {
    const char *card1 = *(const char **)a;
    const char *card2 = *(const char **)b;
    int value1 = 0, value2 = 0;
    for (int i = 0; i < card_map_size; ++i) {
        if (strcmp(card_to_number[i].card, card1) == 0) {
            value1 = card_to_number[i].value;
        }
        if (strcmp(card_to_number[i].card, card2) == 0) {
            value2 = card_to_number[i].value;
        }
    }
    return value1 - value2;
}

int main(){
    char input[100];  // 存储输入字符串
    char *cards[20];  // 存储分割后的扑克牌字符串指针
    int count = 0;    // 扑克牌数量
    // 读取一行输入
    fgets(input, sizeof(input), stdin);
    input[strcspn(input, "\n")] = 0;  // 移除换行符
    // 分割输入字符串
    char *token = strtok(input, " ");
    while (token != NULL) {
        cards[count++] = token;
        token = strtok(NULL, " ");
    }
    // 对扑克牌进行排序
    qsort(cards, count, sizeof(char *), compare_cards);
    // 动态分配二维数组来存储可能的顺子序列
    char **straights[count];
    int lengths[count];  // 存储每个顺子的长度
    for (int i = 0; i < count; ++i) {
        straights[i] = malloc(count * sizeof(char *));
        straights[i][0] = cards[i];
        lengths[i] = 1;
    }
    int num_straights = count;
    // 生成顺子序列
    for (int i = 0; i < count; ++i) {
        for (int j = 0; j < num_straights; ++j) {
            if (compare_cards(&cards[i], &straights[j][lengths[j] - 1]) == 1) {
                straights[j][lengths[j]++] = cards[i];
                break;
            }
        }
    }
    // 输出长度至少为5的顺子序列
    int found = 0;
    for (int i = 0; i < num_straights; ++i) {
        if (lengths[i] >= 5) {
            found = 1;
            for (int j = 0; j < lengths[i]; ++j) {
                printf("%s ", straights[i][j]);
            }
            printf("\n");
        }
        free(straights[i]);
    }
    if (!found) {
        printf("No\n");
    }
    return 0;
}

标签:10,扑克牌,int,斗地主,char,顺子,card
From: https://www.cnblogs.com/SFCY--LQP/p/18545628

相关文章

  • Java斗地主项目碎片
    1.从52张扑克牌中随机抽5张牌/**Tochangethislicenseheader,chooseLicenseHeadersinProjectProperties.*Tochangethistemplatefile,chooseTools|Templates*andopenthetemplateintheeditor.*/packagejavaapplication1;/****@authorA......
  • 蓝桥杯省赛——顺子日期
    小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456等。顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。例如20220123就是一个顺子日期,因为它出现了一个顺子:123;而20221023则不是一个顺子日期,它一个顺子也没有。小明想知道在整......
  • Java小白初探斗地主
    一、前言本人Java小白,一直想做一个斗地主游戏,正好最近学习到了集合。我们都知道集合分为(Collection(单列集合)家族和Map(双列/映射集合)家族)有着长度可变的特性,用来存储斗地主的卡牌再适合不过了。于是今天从下午五点多写到了晚上,主要是中间有几个地方把我卡住了很长时间。二、......
  • 赛博斗地主——使用大语言模型扮演Agent智能体玩牌类游戏。
    通过大模型来实现多个智能体进行游戏对局这个想对已经比较成熟了无论是去年惊艳的斯坦福小镇还是比如metaGPT或者类似的框架都是使用智能体技术让大模型来操控,从而让大模型跳出自身“预测下一个token”的文字功能去探索更多的应用落地可能性。不过一直没有真正操作过,直到前段时间......
  • Java控制台实现斗地主的洗牌和发牌功能
    一、题目要求  有3个玩家:A,B,C。底牌有三张牌,每个人共17张牌,共(17*3+3=54)张牌,实现洗牌与发牌,只在控制没有实现UI可视化。二、思路1、用List集合存储所有的扑克牌。2、洗牌:随机打乱牌的顺序,用到Collections工具类。publicstatic void shuffle(List<?> list)使用默......
  • 综合项目(斗地主)
    一:斗地主游戏(控制台)完成斗地主游戏中的以下步骤:1.准备牌2.洗牌3.发牌PokerGame:importjava.text.CollationElementIterator;importjava.util.ArrayList;importjava.util.Collections;publicclassPokerGame{//准备一副扑克牌//静态代码块,特点:随着类的......
  • 新模拟斗地主
    importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){HashMap<Integer,String>hm=newHashMap<Integer,String>();ArrayList<Integer>al=newArrayList<>();//扑克牌(♦♣♠♥)......
  • 模拟斗地主
    importjava.util.ArrayList;importjava.util.Collections;publicclassMain{publicstaticvoidmain(String[]args){//模拟斗地主的洗牌发牌看牌;//创建扑克牌ArrayList<String>arrayList=newArrayList<>();//扑克牌(♦♣♠♥)......
  • 顺子日期
    题目本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456等。顺子日期指的就是在日期的yyyymmdd表示法中,存在任意连续的三位数是一个顺子的日期。例如20220123就是一个顺子日期,因为它出现了......
  • 自制斗地主小游戏
    自制斗地主小游戏在十月一期间自己搞的小游戏应该没有BUG了。直接下到c++就能玩(不保证编译器对汉字的编码正确,我使用的是小熊猫DEV,旧版DEV也可以玩)高中的我重拾了一个在初中的我的手上还没开始就破产的项目由于技艺不精,只能用贪心策略做,但随缘随机的发牌还是为游戏提供了亿点......