题目描述题目要求根据桥牌手牌评估规则输出推荐叫牌。规则如下基础点数A4\texttt{A}4A4K3\texttt{K}3K3Q2\texttt{Q}2Q2J1\texttt{J}1J1。某花色中若K\texttt{K}K是唯一牌则减111点。某花色中若Q\texttt{Q}Q且该花色牌数≤2\le 2≤2则减111点即只有000或111张其他牌。某花色中若J\texttt{J}J且该花色牌数≤3\le 3≤3则减111点即只有000、111或222张其他牌。某花色恰好有222张牌加111点。某花色恰好有111张牌加222点。某花色没有牌加222点。花色“停止”stopped\texttt{stopped}stopped的条件有A\texttt{A}A或有K\texttt{K}K且至少还有一张其他牌或有Q\texttt{Q}Q且至少还有两张其他牌。叫牌规则若基础点数不包括规则555、666、777≥16\ge 16≥16且所有花色均停止则叫BID NO-TRUMP。否则若总点数≥14\ge 14≥14则在牌数最多的花色中叫BID S、BID H、BID D或BID 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终止。输出格式对于每行输入输出一行推荐叫牌PASS、BID S、BID H、BID D、BID C或BID 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。计算步骤基础点数遍历所有牌累加A,K,Q,J\texttt{A,K,Q,J}A,K,Q,J对应的点数并记录到countOfFaces\textit{countOfFaces}countOfFaces中同时累加countOfSuits\textit{countOfSuits}countOfSuits。减点规则2,3,42,3,42,3,4对每个花色若K\texttt{K}K存在且该花色牌数等于111则减去K\texttt{K}K的数量通常为111。若Q\texttt{Q}Q存在且该花色牌数≤2\le 2≤2则减去Q\texttt{Q}Q的数量。若J\texttt{J}J存在且该花色牌数≤3\le 3≤3则减去J\texttt{J}J的数量。无将叫牌判断检查所有花色是否停止。若全停止且当前点数未加规则5,6,75,6,75,6,7≥16\ge 16≥16则输出BID NO-TRUMP。加点规则5,6,75,6,75,6,7对每个花色若牌数为222加111点若牌数为111或000加222点。叫牌判断若总点数14 1414输出PASS。否则找出牌数最多的花色按SHDC\texttt{S} \texttt{H} \texttt{D} \texttt{C}SHDC的优先级输出若多个花色牌数相同取优先级高的。复杂度分析每手牌处理131313张常数时间完全可接受。代码实现// Bridge Hand Evaluator// UVa ID: 462// Verdict: Accepted// Submission Date: 2016-07-23// UVa Run Time: 0.030s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);mapchar,intsuits{{S,0},{H,1},{D,2},{C,3}};mapchar,intpoint{{A,4},{K,3},{Q,2},{J,1}};mapchar,intfaces{{A,0},{K,1},{Q,2},{J,3}};string line,card;while(getline(cin,line)){istringstreamiss(line);intcountOfSuits[4]{},countOfFaces[4][4]{};// rule 1intpoints0;while(isscard){if(point.find(card.front())!point.end()){pointspoint[card.front()];countOfFaces[suits[card.back()]][faces[card.front()]];}countOfSuits[suits[card.back()]];}// rule 2, 3, 4for(inti0;i4;i){if(countOfFaces[i][1]0countOfFaces[i][1]countOfSuits[i])points-countOfFaces[i][1];if(countOfFaces[i][2]0countOfFaces[i][2]countOfSuits[i]-1)points-countOfFaces[i][2];if(countOfFaces[i][3]0countOfFaces[i][3]countOfSuits[i]-2)points-countOfFaces[i][3];}// no trumpboolall_stoppedtrue;for(inti0;i4;i)all_stoppedall_stopped(countOfFaces[i][0]1||(countOfFaces[i][1]1countOfFaces[i][1]countOfSuits[i]-1)||(countOfFaces[i][2]1countOfFaces[i][2]countOfSuits[i]-2));if(all_stoppedpoints16){coutBID NO-TRUMP\n;continue;}// rule 5, 6, 7for(inti0;i4;i)if(countOfSuits[i]2)points1;elseif(countOfSuits[i]1)points2;if(points14){coutPASS\n;continue;}// bid some suitintmax_length*max_element(countOfSuits,countOfSuits4);if(countOfSuits[0]max_length)coutBID S\n;elseif(countOfSuits[1]max_length)coutBID H\n;elseif(countOfSuits[2]max_length)coutBID D\n;elsecoutBID C\n;}return0;}