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"); } }