题意
有东南西北四个方向,首先指定在某个方向上的人开始发牌,然后从这个方向开始,按照东南西北的顺序,从发牌人的下一个人开始发牌,一人发一张轮流发牌,输入的数据是两串string类型的编码,每两个是一组,一组中第一个是这张牌的花色,第二个事这张牌的大小,要求计算出东南西北四个方向上的每个人的的所有牌,然后按照花色和牌的大小,双关键字排序。
思路
首先想到的是vector数组,,申请4个,代表四个方向的四个人,然后里面是pair<char,char>类型变量,用这种变量来存储每个人的所有牌,用string来存储输入的两组牌面数据,然后发现,每一轮在这组数据中占8位,因为有4个人,每张牌有花色和大小,所以我设计一个for循环,里面的变量i每次加8位,每次一个循环中,就让每个人的vector读取数据中的两位,这样4个人的正确取牌获得,然后我用map,存储所有的牌面和花色的大小,编写一个双关键字比较函数,其中用map来把花色和牌面转成实际值来放进sort函数来进行排序,一开始的时候,我还是设置了另一个map,用来存储东南西北每个方向的下一个方向是什么,最后的时候要求从南方向开始输出,所以最后的时候,用这个map来把开始的时候每个方向上的人和相应的vector数组连接输出即可。
总结
这道题考察如何存储每个人的牌,还有把每个人和相应的方向相联系的操作,还有一个就是,在牌面和花色有部分是字母的情况下,如何进行排序的问题。
AC代码
#include<iostream>
#include<string.h>
#include<utility>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
string simple, simple2;
vector<pair<char, char> > people[4];
map<char, int> dot;
map<char, char> Next;
map<char, int> dui;
bool cmp(pair<char, char> a, pair<char, char> b)
{
if (a.first != b.first)return dot[a.first] < dot[b.first];
return dot[a.second] < dot[b.second];
}
void print(int k)
{
cout << '+';
for (int i = 0; i < 13; i++)
{
cout << "---+";
}
cout << endl;
cout << "|";
for (int i = 0; i < 13; i++)
{
cout << people[k][i].second<<" "<< people[k][i].second<<"|";
}
cout << endl;
cout << "|";
for (int i = 0; i < 13; i++)
{
cout << " " << people[k][i].first << " " << "|";
}
cout << endl;
cout << "|";
for (int i = 0; i < 13; i++)
{
cout << people[k][i].second << " " << people[k][i].second << "|";
}
cout << endl;
cout << '+';
for (int i = 0; i < 13; i++)
{
cout << "---+";
}
cout << endl;
}
int main()
{
for (int i = 0; i < 4; i++)
{
people[i].resize(13);
}
Next['N'] = 'E';
Next['E'] = 'S';
Next['S'] = 'W';
Next['W'] = 'N';
dot['C'] = 0;
dot['D'] = 1;
dot['S'] = 2;
dot['H'] = 3;
dot['T'] = 10;
dot['J'] = 11;
dot['Q'] = 12;
dot['K'] = 13;
dot['A'] = 14;
dot['2'] = 2;
dot['3'] = 3;
dot['4'] = 4;
dot['5'] = 5;
dot['6'] = 6;
dot['7'] = 7;
dot['8'] = 8;
dot['9'] = 9;
char begin;
while (1)
{
cin >> begin;
char then=begin;
for (int i = 0; i < 4; i++)
{
then = Next[then];
dui[then] = i;
}
if (begin == '#')
break;
cin >> simple >> simple2;
simple = simple + simple2;
int b = 0;
for (int i = 0; i < 104; i +=8 )
{
people[0][b]=make_pair(simple[i], simple[i + 1]);
people[1][b]=make_pair(simple[i+2], simple[i + 3]);
people[2][b]=make_pair(simple[i + 4], simple[i + 5]);
people[3][b]=make_pair(simple[i+6], simple[i + 7]);
b++;
}
for (int i = 0; i < 4; i++)
{
sort(people[i].begin(), people[i].end(), cmp);
}
char th='S';
for (int i = 0; i < 4; i++)
{
int k = dui[th];
switch (th)
{
case 'S':
cout << "South player:" << endl;
break;
case 'E':
cout << "East player:" << endl;
break;
case 'W':
cout << "West player:" << endl;
break;
case 'N':
cout << "North player:" << endl;
break;
}
print(k);
th = Next[th];
}
cout << endl;
}
}