C语言/数据结构:实现德州扑克“葫芦”牌型查找(点数限制+最大a优先)

📅 2026/7/16 15:46:07
C语言/数据结构:实现德州扑克“葫芦”牌型查找(点数限制+最大a优先)
问题描述在德州扑克游戏中葫芦Full House是一种由五张牌组成的牌型包含三张相同点数的牌称为a和另外两张相同点数的牌称为b。如果多个玩家都有葫芦则先比较a的大小若a相同再比较b的大小。本题中葫芦需要满足额外条件五张牌的点数之和不能超过给定的最大值max。牌的点数规则如下A 的点数为 14注意不是1K 的点数为 13Q 的点数为 12J 的点数为 11数字牌的点数与其数字相同如10的点数为102的点数为2给定一组牌用点数表示请找出所有可能组成的葫芦中最大的那个即a尽可能大在a相同的情况下b尽可能大。如果存在多个葫芦组合满足条件选择a最大的如果a相同选择b最大的。如果找不到符合条件的葫芦输出 0, 0。注意葫芦必须由五张牌组成且三张a和两张b必须来自给定的牌每张牌只能使用一次。输入格式输入包含三个部分整数n表示牌的数量整数max表示葫芦的五张牌点数之和的最大允许值数组array包含n个整数表示每张牌的点数在代码中你将通过函数参数或标准输入接收到这些值具体取决于编程语言。输出格式输出两个整数分别表示葫芦的三张相同牌的点数a和两张相同牌的点数b用逗号分隔。如果找不到输出 0, 0。程序代码#include stdio.h#include stdlib.hchar* findFullHouse(int n, int max_val, int* array) {// 统计每一点数出现的次数int count[15] {0}; // 点数范围 2~14for (int i 0; i n; i) {if (array[i] 2 array[i] 14) {count[array[i]];}}int best_a 0, best_b 0;// 从大到小遍历 a三张相同牌的点数for (int a 14; a 2; a--) {if (count[a] 3) continue; // 至少需要3张// 从大到小遍历 b两张相同牌的点数for (int b 14; b 2; b--) {if (b a) continue; // a 和 b 必须不同if (count[b] 2) continue; // 至少需要2张// 检查点数之和是否超过最大值int sum a * 3 b * 2;if (sum max_val) {// 由于 a 和 b 都是从大到小遍历第一个满足的就是最大的char* result (char*)malloc(10 * sizeof(char));sprintf(result, %d, %d, a, b);return result;}}}// 没有找到符合条件的葫芦char* result (char*)malloc(10 * sizeof(char));sprintf(result, 0, 0);return result;}int main() {int array[] {6, 6, 6, 8, 8, 8, 5, 5, 1};printf(%s\n, findFullHouse(9, 34, array));return 0;}#include stdio.h #include stdlib.h char* findFullHouse(int n, int max_val, int* array) { // 统计每一点数出现的次数 int count[15] {0}; // 点数范围 2~14 for (int i 0; i n; i) { if (array[i] 2 array[i] 14) { count[array[i]]; } } int best_a 0, best_b 0; // 从大到小遍历 a三张相同牌的点数 for (int a 14; a 2; a--) { if (count[a] 3) continue; // 至少需要3张 // 从大到小遍历 b两张相同牌的点数 for (int b 14; b 2; b--) { if (b a) continue; // a 和 b 必须不同 if (count[b] 2) continue; // 至少需要2张 // 检查点数之和是否超过最大值 int sum a * 3 b * 2; if (sum max_val) { // 由于 a 和 b 都是从大到小遍历第一个满足的就是最大的 char* result (char*)malloc(10 * sizeof(char)); sprintf(result, %d, %d, a, b); return result; } } } // 没有找到符合条件的葫芦 char* result (char*)malloc(10 * sizeof(char)); sprintf(result, 0, 0); return result; } int main() { int array[] {6, 6, 6, 8, 8, 8, 5, 5, 1}; printf(%s\n, findFullHouse(9, 34, array)); return 0; }运行结果分析说明为什么结果不是86 因为五张牌点数之和大于最大允许值34。