问题描述:
瑞神HRZ因为疫情在家闲得无聊,同时他又非常厉害,所有的课对他来说都是水一水就能拿A+,所以他无聊,找来了另外三个人:咕咕东,腾神以及zjm来打牌(天下苦瑞神久矣)。
牌局由四个人构成,围成一圈。我们称四个方向为北 东 南 西。对应的英文是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的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。
解题思路:
创建牌的结构体pai,成员有花色hs,牌号hao,重载小于运算符,实现hs升序,hao升序。花色和号的所有实例分别存储在hss和haoo数组中,函数funhs和funhao实现花色和牌号查找,辅助实现花色比较和牌号比较。再有一个player数组存储四个玩家S,W,N,E,分别对应数字0,1,2,3;创建pai结构体二维数组,当读入的字符不为’#'时,第一个被发牌的人为该字符(发牌员)对应的数字的后面一位(循环后移,即0->1,1->2,2->3,3->0),此后循环将数据存入二维数组中。
二维数组元素全部赋值完成后,用sort函数分别对四个一维数组排序,按照格式输出即可。
实验代码:
#include<iostream>
#include<sstream>
#include <algorithm>
using namespace std;
char hss[4]={'C','D','S','H'}; //花色
char haoo[13]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'}; //牌号
int funhs(char c)
{
for(int i=0;i<4;i++)
if(hss[i]==c)
return i;
return -1;
}
int funhao(char c)
{
for(int i=0;i<13;i++)
if(haoo[i]==c)
return i;
return -1;
}
struct pai
{
char hs; //花色
char hao; //号码
bool operator<(const pai& a) const
{
if(hs!=a.hs)
return funhs(hs)<funhs(a.hs); //比较花色大小
else
return funhao(hao)<funhao(a.hao); //比较号码大小
}
};
char player[4]={'S','W','N','E'};
int fun(char c)
{
for(int i=0;i<4;i++)
if(c==player[i])
return i;
return -1;
}
int main(void)
{
pai a[4][13]; //每个人可以收到13张牌
char c;
pai p;
while(cin>>c)
{
if(c=='#')
return 0;
int per=(fun(c)+1)%4; //被发牌的人
int index[4]={0}; //每次都初始化为0,表示第i个人手中有多少张牌
for(int i=0;i<52;i++)
{
cin>>p.hs>>p.hao; //输入数据
a[per][index[per]].hs=p.hs; //花色
a[per][index[per]].hao=p.hao; //号码
index[per]++;
per=(per+1)%4;
}
//排序
for(int i=0;i<4;i++)
sort(a[i],a[i]+13); //排序每个人
for(int i=0;i<4;i++)
{
// cout<<player[i]<<endl;
if(i==0)
cout<<"South player:"<<endl;
else if(i==1)
cout<<"West player:"<<endl;
else if(i==2)
cout<<"North player:"<<endl;
else if(i==3)
cout<<"East player:"<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
for(int j=0;j<13;j++)
cout<<"|"<<a[i][j].hao<<" "<<a[i][j].hao;
cout<<"|"<<endl;
for(int j=0;j<13;j++)
cout<<"|"<<" "<<a[i][j].hs<<" ";
cout<<"|"<<endl;
for(int j=0;j<13;j++)
cout<<"|"<<a[i][j].hao<<" "<<a[i][j].hao;
cout<<"|"<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
}
cout<<endl;
}
return 0;
}