当前位置: 代码迷 >> 综合 >> 程序设计思维与实践 Week2 实验C 瑞神打牌
  详细解决方案

程序设计思维与实践 Week2 实验C 瑞神打牌

热度:11   发布时间:2024-01-27 05:41:28.0

题意

瑞神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的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。

Example

Input
N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3

Output
在这里插入图片描述

思想

首先,定义一个结构体描述扑克牌,记录扑克牌的花色和数字,并撰写函数cmp,先比较花色再比较数字,值得注意的是当花色相同时,数字之间的比较需要分多种情况讨论。
再者,四人玩牌,每人手中有十三张牌,所以申请一个4行13列的二维数组,由于输出的顺序为South player、West player、North player、East player,所以在输入时,按此顺序将牌数依次按列存放。因为我们是从庄家的顺时针下一位开始发牌,将N-E-S-W作为一个循环圈,存放的行序为S-W-N-E,所以庄家序数为E-S-W-N,用num记录此序数0-1-2-3用以取模输入。输入完成后,对每一行,利用函数cmp排序。
最后,输出格式尤其注意!!

总结

这道题刚开始思路并不明显,只想到要从结构体和比较函数入手,但没有对于庄家下一位顺时针发牌的循环圈处理思路,在搜索学习后得到方法:存放的行序为S-W-N-E,所以庄家序数为E-S-W-N,用num记录此序数0-1-2-3用以输入。部分代码如下:

if(ch=='N') num=3;else if(ch=='E') num=0;else if(ch=='S') num=1;else if(ch=='W') num=2;for(int i=0;i<13;i++){for(int j=0;j<4;j++)cin>>card[(j+num)%4][i].m>>card[(j+num)%4][i].n;}

代码

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
struct node
{char m,n;
}card[4][13];
bool cmp(node a,node b)
{if(a.m==b.m){if(a.n>='2'&&a.n<='9'&&b.n>='2'&&b.n<='9')return a.n>b.n;else if(a.n=='T'&&b.n>='2'&&b.n<='9')return true;else if(a.n=='J'&&((b.n>='2'&&b.n<='9')||b.n=='T'))return true;else if(a.n=='Q'&&((b.n>='2'&&b.n<='9')||b.n=='T'||b.n=='J'))return true;else if(a.n=='K'&&((b.n>='2'&&b.n<='9')||b.n=='T'||b.n=='J'||b.n=='Q'))return true;else if(a.n=='A') return true;return false;}if(a.m=='H') return true;else if(a.m=='S'){if((b.m=='C')||(b.m=='D'))return true;return false;}else if(a.m=='D'){if(b.m=='C') return true;return false;}else return false;
}
int main()
{char ch;int num=0;while (	cin>>ch,ch!='#'){ if(ch=='N') num=3;else if(ch=='E') num=0;else if(ch=='S') num=1;else if(ch=='W') num=2;for(int i=0;i<13;i++){for(int j=0;j<4;j++)cin>>card[(j+num)%4][i].m>>card[(j+num)%4][i].n;}for(int i=0;i<4;i++){sort(card[i],card[i]+13,cmp); //排序 }for(int i=0;i<4;i++){if(i==0)cout<<"South player:"<<endl;if(i==1)cout<<"West player:"<<endl;if(i==2)cout<<"North player:"<<endl;if(i==3)cout<<"East player:"<<endl;cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;for(int k=12;k>=0;k--){cout<<"|"<<card[i][k].n<<" "<<card[i][k].n;}cout<<"|"<<endl;for(int k=12;k>=0;k--){cout<<"| "<<card[i][k].m<<" ";}cout<<"|"<<endl;for(int k=12;k>=0;k--){cout<<"|"<<card[i][k].n<<" "<<card[i][k].n;}cout<<"|"<<endl;cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl; if(i==3) cout<<endl;}}return 0; 
}
  相关解决方案