好比,在打桥牌或者升级。我们的牌抓到手上以后的习惯是,先按照花色来分类。再在花色之间从小到大排序。
1 阶段1 按花色来分类
#include<iostream>
#include <cstdlib>
#include <ctime>
#include<vector>
#include<unordered_map>
#include<cstring>
using namespace std;
const int MAXN = 1e5+5;
enum class Suits:int{
Spades = 0,
Hearts,
Clubs,
Diamonds,
Count
};
struct Card{
Suits suit;
int point;
};
unordered_map<Suits,string> suitStr = {{Suits::Spades,"黑桃"},
{Suits::Hearts,"红桃"},{Suits::Clubs,"梅花"},{Suits::Diamonds,"方片"}
};
unordered_map<int,string> ptStr = {{1,"A"},{11,"J"},
{12,"Q"},{13,"K"}
};
ostream& operator << (std::ostream& os, const Suits& obj)
{
string s = suitStr[obj];
os << s;
return os;
}
ostream& operator << (ostream& o, Card& a)
{
string s = "";
if(ptStr.find(a.point)!=ptStr.end()){
s = ptStr[a.point];
}else{
s = to_string(a.point);
}
o << "花色:"<<a.suit<<" "<< "点数:" << s;
return o;
}
int n;
int main(){
srand(time(NULL));
int divisor = static_cast<int>(Suits::Count);
vector<Card> cards;
for(int i=0;i<10;i++){
auto a = static_cast<Suits>(rand()%divisor);
auto p = rand() % 13 + 1;
cards.push_back({a,p});
}
for(auto c:cards){
cout<<c<<endl;
}
//花色桶,按花色排序
vector<Card> bulket[4];
for(int i=0;i<cards.size();i++){
//按花色分类
auto st = static_cast<int>(cards[i].suit);
bulket[st].push_back(cards[i]);
}
//收集
cards.clear();
for(int i=0;i<4;i++){
for(int j=0;j<bulket[i].size();j++){
cards.push_back(bulket[i][j]);
}
}
cout<<"按花色分类后:"<<endl;
for(auto c:cards){
cout<<c<<endl;
}
return 0;
}
输出:
花色:红桃 点数:8
花色:红桃 点数:10
花色:梅花 点数:Q
花色:红桃 点数:3
花色:梅花 点数:K
花色:方片 点数:3
花色:红桃 点数:Q
花色:黑桃 点数:2
花色:方片 点数:2
花色:梅花 点数:5
按花色分类后:
花色:黑桃 点数:2
花色:红桃 点数:8
花色:红桃 点数:10
花色:红桃 点数:3
花色:红桃 点数:Q
花色:梅花 点数:Q
花色:梅花 点数:K
花色:梅花 点数:5
花色:方片 点数:3
花色:方片 点数:2
可见,扑克牌,已经按照花色排好序了,但花色之间还是乱序的。
阶段 2 再把点数的分类结合进去
注意顺序,先按点数来分,最后按花色来分
因为全局是按 花色来分,然后花色内才是按照点数来排。
如果先按花色来分,最后按点数来分的话,就变成,全局以点数来排,然后点数同的,再以花色来分了
这个地方要注意.
相当于:
struct Card{
Suits suit;
int point;
bool operator<(const Card& c)const{
if(suit==c.suit){
return point<c.point;
}
return suit<c.suit;
}
};
sort(cards.begin(),cards.end());
完整代码如下:
#include<iostream>
#include <cstdlib>
#include <ctime>
#include<vector>
#include<unordered_map>
#include<cstring>
using namespace std;
const int MAXN = 1e5+5;
enum class Suits:int{
Spades = 0,
Hearts,
Clubs,
Diamonds,
Count
};
struct Card{
Suits suit;
int point;
};
unordered_map<Suits,string> suitStr = {{Suits::Spades,"黑桃"},
{Suits::Hearts,"红桃"},{Suits::Clubs,"梅花"},{Suits::Diamonds,"方片"}
};
unordered_map<int,string> ptStr = {{1,"A"},{11,"J"},
{12,"Q"},{13,"K"}
};
ostream& operator << (std::ostream& os, const Suits& obj)
{
string s = suitStr[obj];
os << s;
return os;
}
ostream& operator << (ostream& o, Card& a)
{
string s = "";
if(ptStr.find(a.point)!=ptStr.end()){
s = ptStr[a.point];
}else{
s = to_string(a.point);
}
o << "花色:"<<a.suit<<" "<< "点数:" << s;
return o;
}
int n;
int main(){
srand(time(NULL));
int divisor = static_cast<int>(Suits::Count);
vector<Card> cards;
for(int i=0;i<10;i++){
auto a = static_cast<Suits>(rand()%divisor);
auto p = rand() % 13 + 1;
cards.push_back({a,p});
}
for(auto c:cards){
cout<<c<<endl;
}
//按点数分类
vector<Card> bulket_pt[14];
for(int i=0;i<cards.size();i++){
bulket_pt[cards[i].point].push_back(cards[i]);
}
//花色桶,按花色排序
vector<Card> bulket[4];
for(int i=1;i<14;i++){
for(int j=0;j<bulket_pt[i].size();j++){
auto st = static_cast<int>(bulket_pt[i][j].suit);
bulket[st].push_back(bulket_pt[i][j]);
}
}
//收集
cards.clear();
for(int i=0;i<4;i++){
for(int j=0;j<bulket[i].size();j++){
cards.push_back(bulket[i][j]);
}
}
cout<<"按花色和点数分类后:"<<endl;
for(auto c:cards){
cout<<c<<endl;
}
return 0;
}
输出:
花色:红桃 点数:3
花色:梅花 点数:A
花色:红桃 点数:10
花色:红桃 点数:A
花色:梅花 点数:K
花色:方片 点数:K
花色:红桃 点数:5
花色:黑桃 点数:3
花色:方片 点数:6
花色:黑桃 点数:7
按花色和点数分类后:
花色:黑桃 点数:3
花色:黑桃 点数:7
花色:红桃 点数:A
花色:红桃 点数:3
花色:红桃 点数:5
花色:红桃 点数:10
花色:梅花 点数:A
花色:梅花 点数:K
花色:方片 点数:6
花色:方片 点数:K