题目链接:(—_—) zZ
题目大意:手上有5张牌, 堆上有5张牌, 现在要求舍弃手上的n(0<=n<=5)牌, 从堆的面上拿n张牌, 假设了你有特异功能, 可以知道堆上的5张牌从上到下是是什么, 要求最后得到的牌要面值最大, 一张牌由数字与花色组成。
思路:就是一一枚举出每种请况, 然后判断(不懂打牌的孩子这道题伤不起啊)
code:
#include <stdio.h> #include <string.h> #include <stdlib.h> struct node { char str[3]; }e[12], ee[12], ans[12]; int p = 0, max = 0; char str[][19] = {"highest-card","one-pair","two-pairs","three-of-a-kind", "straight","flush","full-house","four-of-a-kind","straight-flush"}; char str1[19] = "123456789:;<=", str2[10] = "CDHS"; int cmp(void const *a, void const *b) { return (*(struct node *)a).str[0]-(*(struct node *)b).str[0]; } void change(int p) { if(ee[p].str[0] == 'A') {ee[p].str[0] = '1'; return ;} if(ee[p].str[0] == 'T') {ee[p].str[0] = ':'; return ;} if(ee[p].str[0] == 'J') {ee[p].str[0] = ';'; return ;} if(ee[p].str[0] == 'Q') {ee[p].str[0] = '<'; return ;} if(ee[p].str[0] == 'K') {ee[p].str[0] = '='; return ;} return ; } int judge() { int i = 0, p = 0, num1[5], num2[5]; char ans1[10], ans2[10]; qsort(ans, 5, sizeof(ans[0]), cmp);//ans中的字符可以看成1到13的数字 for(i = 0; i<5; i++) { num1[i] = num2[i] = 1; } for(i = 0; i<5; i++) { ans1[i] = ans[i].str[0];//取面值 ans2[i] = ans[i].str[1];//取花色 if(i) { if(ans1[i] == ans1[i-1])//记录出 现次数 num1[i] += num1[i-1]; if(ans2[i] == ans2[i-1]) num2[i] += num2[i-1]; } } p = ans1[0]-'1'; if(p<10 && strncmp(ans1, str1+p, 5) == 0 && num2[4] == 5) return 8; if(ans1[0] == '1' && ans1[1] == ':' && ans1[2] == ';' && ans1[3] == '<' && ans1[4] == '=' && num2[4] == 5) return 8; if(num1[3] == 4 || num1[4] == 4) return 7; if((num1[2] == 3 && num1[4] == 2) || (num1[1] == 2 && num1[4] == 3)) return 6; if(num2[4] == 5) return 5; if(p<10 && strncmp(ans1, str1+p, 5) == 0) return 4; if(ans1[0] == '1' && ans1[1] == ':' && ans1[2] == ';' && ans1[3] == '<' && ans1[4] == '=') return 4; if((num1[4] == 3 && num1[0] == 1 && num1[1] == 1) || (num1[3] == 3 && num1[0] == 1 && num1[4] == 1) || (num1[2] == 3 && num1[4] == 1)) return 3; if((num1[1] == 2 && num1[3] == 2 && num1[4] == 1) || (num1[2] == 2 && num1[4] == 2) || (num1[1] == 2 && num1[4] == 2)) return 2; if((num1[2] == 2) || (num1[3] == 2) || (num1[4] == 2) || (num1[1] == 2)) return 1; return 0; } void create(int cu, int p)//枚举每种情况 { int i = 0, j = 0, k = 0; if(cu == 6) { for(j = p, i = 5; i<=9-p; i++) { strcpy(ee[j++].str, e[i].str); change(j-1); } for(i = 0; i<5; i++) strcpy(ans[i].str, ee[i].str); k = judge(); max = max>k? max:k; return ; } for(i = 0; i<2; i++) { if(i) { strcpy(ee[p].str, e[cu-1].str); change(p); create(cu+1, p+1); } else create(cu+1, p); } } int main() { int i = 0; while(scanf("%s",e[0].str) != EOF) { printf("Hand: "); printf("%s ",e[0].str); for(i = 1; i<10; i++) { scanf("%s",e[i].str); if(i == 5) printf("Deck: "); printf("%s ",e[i].str); } printf("Best hand: "); max = p = 0; create(1, p); printf("%s\n", str[max]); } return 0; }