这个题目就是将手里的5张牌映射成一个个不同的等级
这种映射题目,很明显第一个node,然后再定义一个比较函数,然后排序即可。
需要注意的是:
一些预处理的值必须 , 再return之前
重用一个node必须保证不相互干扰。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <set>
#include <map>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <iterator>
using namespace std;
#define rep(i , n) for(int i = 0 ; i<(int)n;i++)
#define rep1(i , x , y) for(int i = (int)x ; i<=(int)y;i++)
typedef long long LL;
const int N = 10;
struct node{
int a[5];
int val;
int ran;
vector<int> v[5];
int rank(){
bool straight = 1;
rep1(i , 1 ,4){
if(a[i - 1] + 1 == a[i]) continue;
if(i == 4 && a[i] == 12 && a[0] == 0) {
a[i] = -1;
sort(a ,a + 5);
break;
}
straight = false;
break;
}
rep(i , 5){
int j = i , cnt = 0;
for(;j < 5; j++){
if(a[j] != a[i]) break;
++cnt;
}
v[cnt].push_back(a[i]);
i = j - 1;
}
if(val && straight) return 100;
if(v[4].size() > 0) return 99;
if(v[3].size() && v[2].size()) return 98;
if(val) return 97;
if(straight ) return 96;
if(v[3].size()) return 95;
if(v[2].size() == 2) return 94;
if(v[2].size()) return 93;
return 92;
}
void init(){
rep(i , 5) v[i].clear();
ran = rank();
if(v[1].size()) sort(v[1].begin(),v[1].end());
if(v[2].size()) sort(v[2].begin(),v[2].end());
}
void show()const{
for(int i = 0; i<=4 ; i++){
cout<<i <<" *** \n";
for(int j = 0 ; j<v[i].size() ; j++)
cout<<v[i][j]<<" ";
cout<<endl;
}
}
bool operator <(const node& rhs)const{
if(ran != rhs.ran)
return ran < rhs.ran;
for(int i = 4 ; i>=1 ; i--){
if(v[i].size()){
for(int j = v[i].size() - 1 ; j>=0; j--){
if(v[i][j] != rhs.v[i][j])
return v[i][j] < rhs.v[i][j];
}
}
}
return 0;
}
};
const char* str="23456789TJQKA";
int id(char c){
for(int i = 0 ; i<13;i++)
if(str[i] == c) return i;
}
int a[N];
vector<node> ans;
int cnt = 0 ;
map<node , int> vis;
void dfs(int p , int s, int num){
if(p == 5){
int ok = 1;
for(int j = 1 ; j<5 ; j++) if(a[j - 1] == a[j]) {
ok = 0; break;
}
node te;
for(int i = 0 ; i<5;i++) te.a[i] = a[i];
te.val = 0;
te.init();
ans.push_back(te);
if(ok == 1) {
te.val = 1;
te.init();
ans.push_back(te);
}
return ;
}
for(int i = s;i<13;i++){
int nex = (i==s ? num + 1 : 1);
if(nex <= 4){
a[p] = i;
dfs(p + 1 , i , nex);
}
}
}
int main()
{
dfs(0 , 0 , 0);
sort(ans.begin(),ans.end());
int T;
scanf("%d",&T);
while(T--){
string ss;
node te;
int ok = 1 , c;
for(int i = 0 ; i<5;i++){
cin>>ss;
te.a[i] = id(ss[0]);
if(i == 0)
c = ss[1];
else if(c != ss[1])
ok = 0;
te.val = ok;
}
sort(te.a , te.a + 5);
te.init();
cout<<lower_bound(ans.begin(),ans.end(),te)-ans.begin() + 1<<endl;
}
return 0;
}