UVa 462 Bridge Hand Evaluator
2026/6/13 2:40:54 网站建设 项目流程

题目描述

题目要求根据桥牌手牌评估规则,输出推荐叫牌。规则如下:

  1. 基础点数:A=4\texttt{A}=4A=4K=3\texttt{K}=3K=3Q=2\texttt{Q}=2Q=2J=1\texttt{J}=1J=1
  2. 某花色中若K\texttt{K}K是唯一牌,则减111点。
  3. 某花色中若Q\texttt{Q}Q且该花色牌数≤2\le 22,则减111点(即只有000111张其他牌)。
  4. 某花色中若J\texttt{J}J且该花色牌数≤3\le 33,则减111点(即只有000111222张其他牌)。
  5. 某花色恰好有222张牌,加111点。
  6. 某花色恰好有111张牌,加222点。
  7. 某花色没有牌,加222点。

花色“停止”(stopped\texttt{stopped}stopped)的条件:有A\texttt{A}A;或有K\texttt{K}K且至少还有一张其他牌;或有Q\texttt{Q}Q且至少还有两张其他牌。

叫牌规则:

  • 若基础点数(不包括规则555666777≥16\ge 1616且所有花色均停止,则叫BID NO-TRUMP
  • 否则,若总点数≥14\ge 1414,则在牌数最多的花色中叫BID SBID HBID DBID C(优先顺序S,H,D,C\texttt{S,H,D,C}S,H,D,C)。
  • 否则,叫PASS

输入格式

输入包含多行,每行131313张牌,每张牌由两个字符组成:点数(A,2,3,4,5,6,7,8,9,T,J,Q,K\texttt{A,2,3,4,5,6,7,8,9,T,J,Q,K}A,2,3,4,5,6,7,8,9,T,J,Q,K)和花色(S,H,D,C\texttt{S,H,D,C}S,H,D,C)。牌之间用空格分隔。输入以文件结束符(EOF\texttt{EOF}EOF)终止。

输出格式

对于每行输入,输出一行推荐叫牌:PASSBID SBID HBID DBID CBID NO-TRUMP

样例

输入

KS QS TH 8H 4H AC QC TC 5C KD QD JD 8D AC 3C 4C AS 7S 4S AD TD 7D 5D AH 7H 5H

输出

BID D BID NO-TRUMP

题目分析

本题的核心是按照给定规则计算手牌点数并决定叫牌。

数据结构

使用数组countOfSuits[4]\textit{countOfSuits}[4]countOfSuits[4]记录每个花色的牌数,顺序为S,H,D,C\texttt{S,H,D,C}S,H,D,C。使用二维数组countOfFaces[4][4]\textit{countOfFaces}[4][4]countOfFaces[4][4]记录每个花色中A,K,Q,J\texttt{A,K,Q,J}A,K,Q,J的出现次数,顺序为A,K,Q,J\texttt{A,K,Q,J}A,K,Q,J

计算步骤

  1. 基础点数:遍历所有牌,累加A,K,Q,J\texttt{A,K,Q,J}A,K,Q,J对应的点数,并记录到countOfFaces\textit{countOfFaces}countOfFaces中,同时累加countOfSuits\textit{countOfSuits}countOfSuits
  2. 减点(规则2,3,42,3,42,3,4):
    • 对每个花色,若K\texttt{K}K存在且该花色牌数等于111,则减去K\texttt{K}K的数量(通常为111)。
    • Q\texttt{Q}Q存在且该花色牌数≤2\le 22,则减去Q\texttt{Q}Q的数量。
    • J\texttt{J}J存在且该花色牌数≤3\le 33,则减去J\texttt{J}J的数量。
  3. 无将叫牌判断
    • 检查所有花色是否停止。
    • 若全停止且当前点数(未加规则5,6,75,6,75,6,7≥16\ge 1616,则输出BID NO-TRUMP
  4. 加点(规则5,6,75,6,75,6,7):
    • 对每个花色,若牌数为222,加111点;若牌数为111000,加222点。
  5. 叫牌判断
    • 若总点数<14< 14<14,输出PASS
    • 否则,找出牌数最多的花色,按S>H>D>C\texttt{S} > \texttt{H} > \texttt{D} > \texttt{C}S>H>D>C的优先级输出(若多个花色牌数相同,取优先级高的)。

复杂度分析

每手牌处理131313张,常数时间,完全可接受。

代码实现

// Bridge Hand Evaluator// UVa ID: 462// Verdict: Accepted// Submission Date: 2016-07-23// UVa Run Time: 0.030s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);map<char,int>suits={{'S',0},{'H',1},{'D',2},{'C',3}};map<char,int>point={{'A',4},{'K',3},{'Q',2},{'J',1}};map<char,int>faces={{'A',0},{'K',1},{'Q',2},{'J',3}};string line,card;while(getline(cin,line)){istringstreamiss(line);intcountOfSuits[4]={},countOfFaces[4][4]={};// rule 1intpoints=0;while(iss>>card){if(point.find(card.front())!=point.end()){points+=point[card.front()];countOfFaces[suits[card.back()]][faces[card.front()]]++;}countOfSuits[suits[card.back()]]++;}// rule 2, 3, 4for(inti=0;i<4;i++){if(countOfFaces[i][1]>0&&countOfFaces[i][1]==countOfSuits[i])points-=countOfFaces[i][1];if(countOfFaces[i][2]>0&&countOfFaces[i][2]>=countOfSuits[i]-1)points-=countOfFaces[i][2];if(countOfFaces[i][3]>0&&countOfFaces[i][3]>=countOfSuits[i]-2)points-=countOfFaces[i][3];}// no trumpboolall_stopped=true;for(inti=0;i<4;i++)all_stopped=all_stopped&&(countOfFaces[i][0]>=1||(countOfFaces[i][1]>=1&&countOfFaces[i][1]<=countOfSuits[i]-1)||(countOfFaces[i][2]>=1&&countOfFaces[i][2]<=countOfSuits[i]-2));if(all_stopped&&points>=16){cout<<"BID NO-TRUMP\n";continue;}// rule 5, 6, 7for(inti=0;i<4;i++)if(countOfSuits[i]==2)points+=1;elseif(countOfSuits[i]<=1)points+=2;if(points<14){cout<<"PASS\n";continue;}// bid some suitintmax_length=*max_element(countOfSuits,countOfSuits+4);if(countOfSuits[0]==max_length)cout<<"BID S\n";elseif(countOfSuits[1]==max_length)cout<<"BID H\n";elseif(countOfSuits[2]==max_length)cout<<"BID D\n";elsecout<<"BID C\n";}return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询