1 条题解
-
0
题意分析
题目描述了一个简单的扑克游戏评分系统。给定一手张牌,我们需要根据特定的规则计算这手牌的得分。牌的等级和花色都有明确的定义,且每种牌型对应不同的分数。需要注意的是,如果一手牌同时满足多个规则,只应用得分最高的那个规则。
输入
- 第一行是手牌的数量()。
- 接下来的行,每行代表一手牌,每手牌由张牌组成,每张牌由两个大写字母表示(花色等级),两张牌之间用空格隔开。
输出
- 对于每手牌,输出其得分,每行一个结果。
牌型和得分
- 同花顺:分(五张同一花色的连续牌,AKQJX视为连续)。
- 四条:分(四张相同等级的牌加一张杂牌)。
- 葫芦:分(三张相同等级的牌加两张另一等级的牌)。
- 同花:分(五张同一花色的牌)。
- 顺子:分(五张连续的牌,视为连续)。
- 三条:分(三张相同等级的牌加两张不同等级的杂牌)。
- 两对:分(两对相同等级的牌加一张杂牌)。
- 一对:分(两张相同等级的牌加三张不同等级的杂牌)。
- 无任何牌型:分。
标程
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <queue> #include <stack> #define INT_INF 0x3fffffff #define LL_INF 0x3fffffffffffffff #define EPS 1e-12 #define MOD 1000000007 #define PI 3.141592653579798 #define N 300 using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef double DB; struct data { char s[2]; } card[6]; bool cmp(data a,data b) { if(a.s[1]==b.s[1]) return a.s[0]<b.s[0]; else return a.s[1]<b.s[1]; } int cal() { int fg1=1 , fg2=1; for(int i=1;i<=4;i++) if(card[i].s[0]!=card[i+1].s[0]) { fg1=0; break; } for(int i=1;i<=4;i++) if(card[i].s[1]!=card[i+1].s[1]-1) { fg2=0; break; } if(card[1].s[1]==1 && card[2].s[1]==10 && card[3].s[1]==11 && card[4].s[1]==12 && card[5].s[1]==13) fg2=1; if(fg1 && fg2) return 1000; if(card[1].s[1]!=card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]==card[5].s[1]) return 750; if(card[1].s[1]==card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 750; if(card[1].s[1]==card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]==card[5].s[1]) return 500; if(card[1].s[1]==card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]==card[5].s[1]) return 500; if(fg1) return 350; if(fg2) return 250; if(card[1].s[1]!=card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]==card[5].s[1]) return 200; if(card[1].s[1]==card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 200; if(card[1].s[1]!=card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]==card[5].s[1]) return 100; if(card[1].s[1]==card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]==card[5].s[1]) return 100; if(card[1].s[1]==card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 100; if(card[1].s[1]==card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 50; if(card[1].s[1]!=card[2].s[1] && card[2].s[1]==card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 50; if(card[1].s[1]!=card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]==card[4].s[1] && card[4].s[1]!=card[5].s[1]) return 50; if(card[1].s[1]!=card[2].s[1] && card[2].s[1]!=card[3].s[1] && card[3].s[1]!=card[4].s[1] && card[4].s[1]==card[5].s[1]) return 50; return 0; } int main() { int n; scanf("%d",&n); for(int ca=1;ca<=n;ca++) { for(int i=1;i<=5;i++) { scanf("%s",&card[i].s); if(card[i].s[1]>='0' && card[i].s[1]<='9') card[i].s[1]=card[i].s[1]-'0'; if(card[i].s[1]=='A') card[i].s[1]=1; if(card[i].s[1]=='X') card[i].s[1]=10; if(card[i].s[1]=='J') card[i].s[1]=11; if(card[i].s[1]=='Q') card[i].s[1]=12; if(card[i].s[1]=='K') card[i].s[1]=13; } sort(card+1,card+1+5,cmp); printf("%d\n",cal()); } return 0; }
- 1
信息
- ID
- 1694
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者