UVa 555 Bridge Hands

UVa 555 Bridge Hands

题目描述

题目要求模拟发牌过程,并对每个玩家的手牌进行排序,按花色(梅花♣\clubsuit、方块♢\diamondsuit、黑桃♠\spadesuit、红桃♡\heartsuit)和点数(2<3<⋯<T<J<Q<K<A2 < 3 < \dots < \text{T} < \text{J} < \text{Q} < \text{K} < \text{A}2<3<<T<J<Q<K<A)升序排列。输出四位玩家的手牌,顺序为S\texttt{S}SW\texttt{W}WN\texttt{N}NE\texttt{E}E

输入格式

输入包含多个测试用例。每个测试用例第一行是一个字符,表示发牌人(N\texttt{N}NE\texttt{E}ES\texttt{S}SW\texttt{W}W)。接下来两行,每行262626个字符,表示一副牌(每张牌由花色和点数两个字符组成,共525252个字符)。输入以#结束。

输出格式

对于每个测试用例,输出四行,格式为玩家: 牌1 牌2 ...,玩家顺序为S\texttt{S}SW\texttt{W}WN\texttt{N}NE\texttt{E}E

样例

输入

N CQDTC4D8S7HTDAH7D2S3D6C6S6D9S4SAD7H2CKH5D3CT8SC9H3C3 DQS9SQDJH8HAS2SKD4H4S5C7SJC8DKC5C2CAHQCJSTH6HKH9D5HJ #

输出

S:C3C5C7CTCJ D9DTDJ S3SKH2H9HT W:C2C4CK D4D5D6DQDA S4S8ST SJH8 N:C6C8C9CA D8S9SAH4H5H6H7HJHA E:CQ D2 D3 D7 DK S2 S5 S6 S7 SQ H3 HQ HK

题目分析

本题的核心是模拟发牌和排序。

发牌规则

  • 发牌人先发给自己左手边的玩家,按顺时针顺序依次发牌。
  • 525252张牌,每位玩家得到131313张。

排序规则

  • 花色顺序:C<D<S<H\texttt{C} < \texttt{D} < \texttt{S} < \texttt{H}C<D<S<H
  • 点数顺序:2<3<4<5<6<7<8<9<T<J<Q<K<A2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < \text{T} < \text{J} < \text{Q} < \text{K} < \text{A}2<3<4<5<6<7<8<9<T<J<Q<K<A

输出顺序

输出四行,顺序为S\texttt{S}SW\texttt{W}WN\texttt{N}NE\texttt{E}E,即南、西、北、东。

算法步骤

  1. 确定发牌起始玩家(发牌人的左手边)。
  2. 读取525252张牌,依次分配给四位玩家。
  3. 对每位玩家的手牌按花色和点数排序。
  4. 按指定顺序输出。

复杂度分析

O(52log⁡13)O(52 \log 13)O(52log13),可接受。

代码实现

// Bridge Hands// UVa ID: 555// Verdict: Accepted// Submission Date: 2016-08-12// UVa Run Time: 0.040s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;map<char,int>suits={{'C',0},{'D',1},{'S',2},{'H',3}};map<char,int>ranks={{'2',0},{'3',1},{'4',2},{'5',3},{'6',4},{'7',5},{'8',6},{'9',7},{'T',8},{'J',9},{'Q',10},{'K',11},{'A',12}};map<int,char>dealers={{0,'S'},{1,'W'},{2,'N'},{3,'E'}};map<char,int>offset={{'S',3},{'W',2},{'N',1},{'E',0}};string suit_text="CDSH",rank_text="23456789TJQKA";structcard{intsuit,rank;booloperator<(constcard&another)const{if(suit!=another.suit)returnsuit<another.suit;elsereturnrank<another.rank;}};intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);chardealer,suit,rank;while(cin>>dealer,dealer!='#'){vector<vector<card>>cards(4,vector<card>(13));for(inti=0;i<13;i++)for(intj=0;j<4;j++){cin>>suit>>rank;cards[j][i].suit=suits[suit];cards[j][i].rank=ranks[rank];}for(inti=0;i<4;i++)sort(cards[i].begin(),cards[i].end());for(autod:dealers){cout<<d.second<<':';for(autoc:cards[(offset[dealer]+d.first)%4])cout<<' '<<suit_text[c.suit]<<rank_text[c.rank];cout<<'\n';}}return0;}