B-东东学打牌
题目描述:
解题思路:看这道题就觉得很熟悉,和之前做过的一道大模拟判断牌的方法是一样的,我就想到在之前的代码基础上更改。只需要增加记录大小的量还有判断大小的方法就可以了
首先得记录他是哪一手牌,这是第一判定条件
其次分析如果属于同样的手牌有什么样的判定方式
例如:3.两对,首先我们判断第一大对的值记为aa,其次记录第二对的值记为bb,再次记录剩下一张单牌的值记为sum,最后在比较大小的时候就可以直接用了
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
struct player{
string name;
int pai[5];
int level;
int aa,bb,sum;
bool operator<(player& t) const
{
if(level!=t.level) return level<t.level;
if(aa!=t.aa) return aa<t.aa;
if(bb!=t.bb) return bb<t.bb;
if(sum!=t.sum) return sum<t.sum;
return name>t.name;
}
void cc(string s);
void check();
}wanjia[100010];
void player::check()
{
int a[5];
for(int i=0;i<5;i++)
a[i]=pai[i];
if(a[4]==a[3]+1&&a[3]==a[2]+1&&a[2]==a[1]+1&&a[1]==a[0]+1) //顺子
{
level=7;
aa=a[4];
bb= sum=0;
return;
}
else if(a[4]==13&&a[3]==12&&a[2]==11&&a[1]==10&&a[0]==1) //龙顺
{
level=8;
aa= bb= sum=0;
return;
}
else if(a[0]==a[1]&&a[0]==a[2]&&a[0]==a[3]) //炸弹1
{
level=6;
aa=a[0];
bb=a[4];
sum=0;
}
else if(a[1]==a[2]&&a[1]==a[3]&&a[1]==a[4]) //炸弹2
{
level=6;
aa=a[1];
bb=a[0];
sum=0;
return;
}
else if(a[0]==a[1]&&a[0]==a[2]&&a[3]==a[4]) //三带二1
{
level=5;
aa=a[0];
bb=a[3];
sum=0;
return;
}
else if(a[0]==a[1]&&a[2]==a[3]&&a[2]==a[4]) //三带二2
{
level=5;
aa=a[2];
bb=a[0];
sum=0;
return;
}
else if(a[0]==a[1]&&a[0]==a[2]) //三个1
{
level=4;
aa=a[0];
bb=0;
sum=a[3]+a[4];
return;
}
else if(a[1]==a[2]&&a[1]==a[3]) //三个2
{
level=4;
aa=a[1];
bb=0;
sum=a[0]+a[4];
return;
}
else if(a[2]==a[3]&&a[2]==a[4]) //三个3
{
level=4;
aa=a[2];
bb=0;
sum=a[0]+a[1];
return;
}
else if(a[0]==a[1]&&a[2]==a[3]) //两对,已经排除三带二1
{
level=3;
aa=a[2];
bb=a[0];
sum=a[4];
return;
}
else if(a[0]==a[1]&&a[3]==a[4]) //两对,已经排除三带二2
{
level=3;
aa=a[3];
bb=a[0];
sum=a[2];
return;
}
else if(a[1]==a[2]&&a[3]==a[4]) //两对,已经排除三带二3
{
level=3;
aa=a[3];
bb=a[1];
sum=a[0];
return;
}
else if(a[0]==a[1]) //一对1
{
level=2;
aa=a[0];
bb=0;
sum=a[2]+a[3]+a[4];
return;
}
else if(a[1]==a[2]) //一对2
{
level=2;
aa=a[1];
bb=0;
sum=a[0]+a[3]+a[4];
return;
}
else if(a[2]==a[3]) //一对3
{
level=2;
aa=a[2];
bb=0;
sum=a[0]+a[1]+a[4];
return;
}
else if(a[3]==a[4]) //一对4
{
level=2;
aa=a[3];
bb=0;
sum=a[0]+a[1]+a[2];
return;
}
else //大牌
{
level=1;
aa= bb=0;
sum=a[0]+a[1]+a[2]+a[3]+a[4];
}
}
void player::cc(string s)
{
int tot=0;
int n=s.size();
for(int i=0;i<n;)
{
if(s[i]>='2'&&s[i]<='9')
{
pai[tot++]=s[i]-'0';
i++;
}
else
{
if(s[i]=='1')
{
pai[tot++]=10;
i+=2;
}
else
{
if (s[i] == 'A') pai[tot++] = 1;
if (s[i] == 'J') pai[tot++] = 11;
if (s[i] == 'Q') pai[tot++] = 12;
if (s[i] == 'K') pai[tot++] = 13;
i++;
}
}
}
sort( pai, pai+5);
}
int main(){
int n=0;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
string name,s;
cin>>name>>s;
wanjia[i].name=name;
wanjia[i].cc(s);
wanjia[i].check();
}
sort(wanjia,wanjia+n);
for(int i=n-1;i>=0;i--)
cout<<wanjia[i].name<<endl;
}
return 0;
}