ZOJ1111:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1011
关键是怎么对一手牌来进行评估,也没什么算法,主要就是复杂一点,用两个标志,一个是level,一个是level相等时要比较牌的大小,要从大到小来排。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
#define pb push_back
int trans[256]={0,0};
struct card
{
int num;
char col;
card(char n,char c):num(trans[n]),col(c){}
bool operator<(const card& o)const
{
return num<o.num;
}
};
struct hand
{
int color[26];
int number[256];
vector<card> cards;
int sameCol;
int sameNum;
int level;
int score[6];
hand()
{
memset(color,0,sizeof(color));
memset(number,0,sizeof(number));
memset(score,0,sizeof(score));
sameCol=0;
sameNum=0;
level=0;
}
void addCard(card c)
{
color[c.col]++;
number[c.num]++;
sameCol=max(sameCol,color[c.col]);
sameNum=max(sameNum,number[c.num]);
cards.pb(c);
}
bool isCons()
{
sort(cards.begin(),cards.end());
char pre=cards[0].num;
for(int i=1;i<=4;i++)
{
if ( cards[i].num!=pre+1)
return false;
pre=cards[i].num;
}
return true;
}
void calScore()
{
sort(cards.begin(),cards.end());
//同花顺
if ( sameCol==5)
{
//同花顺
if(isCons())
{
level=9;
for(int i=4;i>=0;i--)
score[4-i]=cards[i].num;
}
//同花
else
{
level=6;
for(int i=4;i>=0;i--)
score[4-i]=cards[i].num;
}
return;
}
//铁支
if ( sameNum==4)
{
int n1,n2;
if (cards[0].num==cards[1].num)
n1=cards[0].num,n2=cards[4].num;
else
n1=cards[4].num,n2=cards[0].num;
score[0]=score[1]=score[2]=score[3]=n1;
score[4]=n2;
level=8;
return;
}
if ( sameNum==3 )
{
int n1,n2,n3;
if ( cards[0].num==cards[2].num )
n1=cards[0].num,n2=cards[3].num,n3=cards[4].num;
else
n1=cards[4].num,n2=cards[0].num,n3=cards[1].num;
score[0]=score[1]=score[2]=n1;
//葫芦
if ( n2==n3 )
{
level=7;
score[3]=score[4]=n2;
//三条
}
else
{
level=4;
score[3]=max(n2,n3);
score[4]=min(n2,n3);
}
return;
}
//顺子
if ( isCons() )
{
for(int i=4;i>=0;i--)
score[4-i]=cards[i].num;
level=5;
return;
}
if ( sameNum==2)
{
int same1=-1,same2=-1;
int sum=cards[0].num;
for(int i=1;i<5;i++)
{
sum+=cards[i].num;
if(cards[i].num==cards[i-1].num)
{
if(same1==-1)
same1=cards[i].num;
else
same2=cards[i].num;
}
}
//双对
if ( same2!=-1)
{
level=3;
score[0]=score[1]=max(same1,same2);
score[2]=score[3]=min(same1,same2);
score[4]=sum-same1*2-same2*2;
return;
}
//单对
else
{
score[0]=score[1]=same1;
int j=2;
for(int i=4;i>=0;i--)
{
if (cards[i].num!=same1)
score[j++]=cards[i].num;
}
level=2;
return ;
}
}
//散牌
level=1;
for(int i=4;i>=0;i--)
score[4-i]=cards[i].num;
return;
}
int compare(const hand& o)const
{
if (level>o.level)
return 1;
else if (level<o.level)
return -1;
else
{
for(int i=0;i<5;i++)
{
if (score[i]>o.score[i])
return 1;
else if (score[i]<o.score[i])
return -1;
}
return 0;
}
}
};
int main()
{
char tmp[20];
//A
trans['A']=14;
trans['K']=13;
trans['Q']=12;
trans['J']=11;
trans['T']=10;
trans['9']=9;
trans['8']=8;
trans['7']=7;
trans['6']=6;
trans['5']=5;
trans['4']=4;
trans['3']=3;
trans['2']=2;
while(1)
{
hand h[2];
for(int i=0;i<2;i++)
{
for(int j=0;j<5;j++)
{
if(scanf("%s",tmp)==EOF)
return 0;
card tc(tmp[0],tmp[1]-'A');
h[i].addCard(tc);
}
}
h[0].calScore();
h[1].calScore();
int ans=h[0].compare(h[1]);
if( ans>0)
printf("Black wins.\n");
else if (ans==0)
printf("Tie.\n");
else
printf("White wins.\n");
}
}