題意
有東南西北四個方向,首先指定在某個方向上的人開始發(fā)牌赦政,然后從這個方向開始胜宇,按照東南西北的順序,從發(fā)牌人的下一個人開始發(fā)牌恢着,一人發(fā)一張輪流發(fā)牌桐愉,輸入的數(shù)據(jù)是兩串string類型的編碼,每兩個是一組掰派,一組中第一個是這張牌的花色从诲,第二個事這張牌的大小,要求計算出東南西北四個方向上的每個人的的所有牌靡羡,然后按照花色和牌的大小系洛,雙關鍵字排序。
思路
首先想到的是vector數(shù)組略步,描扯,申請4個,代表四個方向的四個人趟薄,然后里面是pair<char,char>類型變量绽诚,用這種變量來存儲每個人的所有牌,用string來存儲輸入的兩組牌面數(shù)據(jù)杭煎,然后發(fā)現(xiàn)憔购,每一輪在這組數(shù)據(jù)中占8位,因為有4個人岔帽,每張牌有花色和大小,所以我設計一個for循環(huán)导绷,里面的變量i每次加8位犀勒,每次一個循環(huán)中,就讓每個人的vector讀取數(shù)據(jù)中的兩位妥曲,這樣4個人的正確取牌獲得贾费,然后我用map,存儲所有的牌面和花色的大小,編寫一個雙關鍵字比較函數(shù)檐盟,其中用map來把花色和牌面轉(zhuǎn)成實際值來放進sort函數(shù)來進行排序褂萧,一開始的時候,我還是設置了另一個map葵萎,用來存儲東南西北每個方向的下一個方向是什么导犹,最后的時候要求從南方向開始輸出唱凯,所以最后的時候,用這個map來把開始的時候每個方向上的人和相應的vector數(shù)組連接輸出即可谎痢。
總結(jié)
這道題考察如何存儲每個人的牌磕昼,還有把每個人和相應的方向相聯(lián)系的操作,還有一個就是节猿,在牌面和花色有部分是字母的情況下票从,如何進行排序的問題。
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;
}
}