题目
牌局由四个人构成,围成一圈。我们称四个方向为北 东 南 西。对应的英文是North,East,South,West。游戏一共由一副扑克,也就是52张构成。开始,我们指定一位发牌员(东南西北中的一个,用英文首字母标识)开始发牌,发牌顺序为顺时针,发牌员第一个不发自己,而是发他的下一个人(顺时针的下一个人)。这样,每个人都会拿到13张牌。
现在我们定义牌的顺序,首先,花色是(梅花)<(方片)<(黑桃)<(红桃),(输入时,我们用C,D,S,H分别表示梅花,方片,黑桃,红桃,即其单词首字母)。对于牌面的值,我们规定2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。
现在你作为上帝,你要从小到大排序每个人手中的牌,并按照给定格式输出。(具体格式见输出描述和样例输出)。
Input
输入包含多组数据
每组数据的第一行包含一个大写字符,表示发牌员是谁。如果该字符为‘#’则表示输入结束。
接下来有两行,每行有52个字符,表示了26张牌,两行加起来一共52张牌。每张牌都由两个字符组成,第一个字符表示花色,第二个字符表示数值。
Output
输出多组数据发牌的结果,每组数据之后需要额外多输出一个空行!!!!!
每组数据应该由24行的组成,输出按照顺时针方向,始终先输出South Player的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。
Sample Input
N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3
Sample Output
South player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
| C | C | D | D | S | S | S | S | H | H | H | H | H |
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
West player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
| C | C | C | C | D | D | D | S | S | S | S | H | H |
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
North player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
| C | C | C | D | D | D | D | D | S | S | S | H | H |
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
East player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
| C | C | C | C | D | D | D | S | S | H | H | H | H |
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
思路
数据结构
map<char,int> huase 将花色映射为数字方便比较
map<char,int> number 将用字母表示的数字映射成对应数字,方便比较
struct poke
{
char a[2];
bool operator<(const poke &p) const
{
if(this->a[0]!=p.a[0])
return huase[this->a[0]]<huase[p.a[0]];
else
return number[this->a[1]]<number[p.a[1]];
}
}N[13],E[13],S[13],W[13];
记录东西南北玩家的牌的花色和数字,根据牌大小规则重载比较函数
做法
step1 从命令行接收发牌人和两行发牌顺序,并合并成一个字符串记录在str中
step2 根据发牌人,从对应入口进入发牌循环,将所发牌一次记录在对应的玩家下直到牌全部发完
step3 调用sort函数对W E S N的牌进行排序
step4 根据输出规则对牌进行输出
总结
1、此题直接不断从命令行接收一个个的牌会超时,需要一次性将发牌顺序接收到字符串str中再对字符串进行处理
2、当用scanf(“%c”,&a)接收时一次只可接收一个字符,回车和空格也会被按一个字符接收进来,要注意用getchar()规避。
代码
#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
map<char,int> huase;
map<char,int> number;
struct poke
{
char a[2];
bool operator<(const poke &p) const
{
if(this->a[0]!=p.a[0])
return huase[this->a[0]]<huase[p.a[0]];
else
return number[this->a[1]]<number[p.a[1]];
}
}N[13],E[13],S[13],W[13];
int main()
{
huase['C']=1;
huase['D']=2;
huase['S']=3;
huase['H']=4;
number['2']=2;
number['3']=3;
number['4']=4;
number['5']=5;
number['6']=6;
number['7']=7;
number['8']=8;
number['9']=9;
number['T']=10;
number['J']=11;
number['Q']=12;
number['K']=13;
number['A']=14;
char fapai;
cin>>fapai;
while(fapai!='#')
{
string pai1,pai2,pai;
cin>>pai1>>pai2;
pai=pai1+pai2;
int i=0,j=0;
while(i<52)
{
if(i!=0||fapai=='N')
{
E[i/4].a[0]=pai[j++];
E[i/4].a[1]=pai[j++];
i++;
if(i==52)
break;
}
if(i!=0||fapai=='E')
{
S[i/4].a[0]=pai[j++];
S[i/4].a[1]=pai[j++];
i++;
if(i==52)
break;
}
if(i!=0||fapai=='S')
{
W[i/4].a[0]=pai[j++];
W[i/4].a[1]=pai[j++];
i++;
if(i==52)
break;
}
if(i!=0||fapai=='W')
{
N[i/4].a[0]=pai[j++];
N[i/4].a[1]=pai[j++];
i++;
if(i==52)
break;
}
}
sort(N,N+13);
sort(E,E+13);
sort(S,S+13);
sort(W,W+13);
cout<<"South player:"<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
for(int j=0;j<13;j++)
cout<<"|"<<S[j].a[1]<<' '<<S[j].a[1];
cout<<'|'<<endl;
for(int j=0;j<13;j++)
cout<<"| "<<S[j].a[0]<<' ';
cout<<'|'<<endl;
for(int j=0;j<13;j++)
cout<<"|"<<S[j].a[1]<<' '<<S[j].a[1];
cout<<'|'<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
cout<<"West player:"<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
for(int j=0;j<13;j++)
cout<<"|"<<W[j].a[1]<<' '<<W[j].a[1];
cout<<'|'<<endl;
for(int j=0;j<13;j++)
cout<<"| "<<W[j].a[0]<<' ';
cout<<'|'<<endl;
for(int j=0;j<13;j++)
cout<<"|"<<W[j].a[1]<<' '<<W[j].a[1];
cout<<'|'<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
cout<<"North player:"<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
for(int j=0;j<13;j++)
cout<<"|"<<N[j].a[1]<<' '<<N[j].a[1];
cout<<'|'<<endl;
for(int j=0;j<13;j++)
cout<<"| "<<N[j].a[0]<<' ';
cout<<'|'<<endl;
for(int j=0;j<13;j++)
cout<<"|"<<N[j].a[1]<<' '<<N[j].a[1];
cout<<'|'<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
cout<<"East player:"<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
for(int j=0;j<13;j++)
cout<<"|"<<E[j].a[1]<<' '<<E[j].a[1];
cout<<'|'<<endl;
for(int j=0;j<13;j++)
cout<<"| "<<E[j].a[0]<<' ';
cout<<'|'<<endl;
for(int j=0;j<13;j++)
cout<<"|"<<E[j].a[1]<<' '<<E[j].a[1];
cout<<'|'<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
cout<<endl;
cin>>fapai;
}
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)