AKSZ-月赛题3
2024-05-02 17:12:11
发布于:广东
这道题是关于德州扑克牌力比较的问题,需要根据给定的手牌和牌河情况来确定最大的组合牌力情况。以下是这道题的解题思路:
- 定义结构体和变量来存储扑克牌的点数和花色,以及相关计数变量。
- 编写函数来处理点数和花色的转换、记录扑克牌情况、计算各种牌力、检查并更新最大牌力情况等。
- 分别处理没有手牌、有一张手牌和两张手牌的情况,考虑所有可能的组合。
- 根据题目给出的牌力情况说明,确定最终的牌力情况并输出对应的英文名。
以上是代码的逻辑,下面解释一下代码各部分的作用:
init
函数:初始化数组和变量。changeP
函数:根据输入的字符转换为对应的点数。changeC
函数:根据输入的字符转换为对应的花色。record
函数:记录扑克牌的点数和花色。count
函数:计算各种牌力情况的数量。check
函数:根据各种情况的数量更新最大牌力情况。solve0
、solve1
、solve2
函数:处理没有手牌、有一张手牌和两张手牌的情况。main
函数:读取输入数据,调用相应的函数,并输出结果。
下面是代码实现
#include<bits/stdc++.h>
using namespace std;
int a[10];
int tot;
int p[20];
int c[10];
int cnt2,cnt3,cnt4;
int flu;
int stg;
int maxx;
string h[5];
string r[10];
void init(){
memset(a,0,sizeof(a));
memset(p,0,sizeof(p));
memset(c,0,sizeof(c));
tot = 0;
}
int changeP(char tmp, int A){
int point;
if(tmp>='0' && tmp <= '9')point = tmp - '0';
else if(tmp == 'T')point = 10;
else if(tmp == 'J')point = 11;
else if(tmp == 'Q')point = 12;
else if(tmp == 'K')point = 13;
else if(tmp == 'A')point = A;
return point;
}
int changeC(char tmp){
if(tmp == 'S')return 0;
else if(tmp == 'H')return 1;
else if(tmp == 'C')return 2;
else return 3;
}
void record(string s,int A){
int point = changeP(s[0],A);
int color = changeC(s[1]);
a[tot++] = point;
p[point] ++;
c[color] ++;
}
void count()
{
cnt2 = cnt3 = cnt4 = 0;
for(int i = 1; i <= 14; i++){
if(p[i] == 2) cnt2 ++;
else if(p[i] == 3) cnt3 ++;
else if(p[i] == 4) cnt4 ++;
}
stg = 1;
sort(a,a+5);
for(int i = 1 ;i < 5;i++){
if(a[i] != a[i-1] + 1){
stg = 0;
break;
}
}
flu = 0;
for(int i = 0 ;i < 4;i++){
if(c[i] == 5){
flu = 1;
break;
}
}
}
void check(){
if(flu && stg && a[0] == 10){
maxx = min(1,maxx);
return;
}
if(flu && stg){
maxx = min(2,maxx);
return;
}
if(cnt4){
maxx = min(3,maxx);
return;
}
if(cnt3 && cnt2){
maxx = min(4,maxx);
return;
}
if(flu){
maxx = min(5,maxx);
return;
}
if(stg){
maxx = min(6,maxx);
return;
}
if(cnt3){
maxx = min(7,maxx);
return;
}
if(cnt2 == 2){
maxx = min(8,maxx);
return;
}
if(cnt2 == 1){
maxx = min(9,maxx);
return;
}
maxx = min(10,maxx);
return;
}
void solve0(int A)
{
init();
for(int i = 0; i < 5; i++){
record(r[i],A);
}
count();
check();
}
void solve1(string tmp, int A){
for(int i = 0 ; i < 5 ;i++){
init();
record(tmp,A);
for(int j = 0; j < 5 ;j++ ){
if(i == j) continue;
record(r[j],A);
}
count();
check();
}
}
void solve2(int A){
for(int i = 0 ;i < 5; i++){
for(int j = i + 1 ;j < 5; j++){
init();
record(h[0],A);
record(h[1],A);
for(int k = 0 ; k < 5 ; k++){
if(k == i || k == j){
continue;
}
record(r[k],A);
}
count();
check();
}
}
}
string ans[] = {"","ROYAL FLUSH",
"STRAIGHT FLUSH",
"FOUR OF A KIND",
"FULL HOUSE",
"FLUSH",
"STRAIGHT",
"THREE OF KIND",
"TWO PAIR",
"ONE PAIR",
"HIGH CARD"};
int main(){
freopen("poker.in","r",stdin);
freopen("poker.out","w",stdout);
int T;
cin>>T;
while(T--){
maxx = 10;
for(int i = 0 ; i <2 ;i++)cin>>h[i];
for(int i = 0 ; i <5 ;i++)cin>>r[i];
solve0(1);
solve0(14);
solve1(h[0],1);
solve1(h[1],1);
solve1(h[0],14);
solve1(h[1],14);
solve2(1);
solve2(14);
cout << ans[maxx] << endl;
}
return 0;
}
全部评论 2
Vocal
2024-10-04 来自 广东
0👍👍👍
2024-10-04 来自 江苏
0
有帮助,赞一个