2218-K Poker
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=2218
問題概要
略
考え方
Wikipediaに書いてあることを参考に実装する。
トランプをあらかじめソートしておくと楽に判定出来る。
実装(C++)
#include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #include <algorithm> #include <vector> #include <iostream> #include <string> using namespace std; typedef long long int lli; typedef unsigned int uint; enum MARK{SPADE,CLUB,HEART,DIAMOND}; const char MARK_CHAR[4]={'S','C','H','D'}; const char VAL_CHAR[13]={'A','2','3','4','5','6','7','8','9','T','J','Q','K'}; struct Trump{ MARK mark; int val; Trump(MARK m,int v){mark=m;val=v;} Trump(){} Trump(string in){ char m=in[1],v=in[0]; for(int i=0;i<4;i++) if(MARK_CHAR[i]==m)mark=(MARK)i; for(int i=0;i<13;i++) if(VAL_CHAR[i]==v)val=i+1; } string toString(){ string res=""; res=res+MARK_CHAR[(int)mark]+VAL_CHAR[val];return res; } }; bool operator<(Trump a,Trump b){ if(a.val==b.val)return a.mark<b.mark; return a.val<b.val; } bool operator>(Trump b,Trump a){return a<b;} //0:ノーペア 1:ワンペア 2:ツーペア 3:スリーカード 4:ストレート 5:フラッシュ 6:フルハウス 7:フォーカード 8:ストレートフラッシュ 9:ロイヤルストレートフラッシュ int checkpoker(vector<Trump> cards){ std::sort(cards.begin(),cards.end()); if(cards[0].mark==cards[1].mark&&cards[0].mark==cards[2].mark&&cards[0].mark==cards[3].mark&&cards[0].mark==cards[4].mark){ if(cards[0].val==1&&cards[1].val==10&&cards[2].val==11&&cards[3].val==12&&cards[4].val==13)return 9; if(cards[4].val-cards[3].val==1&&cards[3].val-cards[2].val==1&&cards[2].val-cards[1].val==1&&cards[1].val-cards[0].val==1)return 8;} if(cards[0].val==cards[3].val||cards[1].val==cards[4].val)return 7; if((cards[0].val==cards[2].val&&cards[3].val==cards[4].val)||(cards[0].val==cards[1].val&&cards[2].val==cards[4].val))return 6; if(cards[0].mark==cards[1].mark&&cards[0].mark==cards[2].mark&&cards[0].mark==cards[3].mark&&cards[0].mark==cards[4].mark)return 5; if(cards[0].val==1&&cards[1].val==10&&cards[2].val==11&&cards[3].val==12&&cards[4].val==13)return 4; if(cards[4].val-cards[3].val==1&&cards[3].val-cards[2].val==1&&cards[2].val-cards[1].val==1&&cards[1].val-cards[0].val==1)return 4; if(cards[0].val==cards[2].val||cards[1].val==cards[3].val||cards[2].val==cards[4].val)return 3; if((cards[0].val==cards[1].val&&cards[2].val==cards[3].val)||(cards[1].val==cards[2].val&&cards[3].val==cards[4].val)||(cards[0].val==cards[1].val&&cards[3].val==cards[4].val))return 2; if((cards[0].val==cards[1].val)||(cards[1].val==cards[2].val)||(cards[2].val==cards[3].val)||(cards[3].val==cards[4].val))return 1; return 0; } int pts[4][13]; int ans[10]; int main(){ ans[0]=0; int s=0; for(int n;cin>>n;s++){ if(s)cout<<endl; for(int i=0;i<4;i++) for(int j=0;j<13;j++)cin>>pts[i][j]; for(int i=1;i<=9;i++)cin>>ans[i]; vector<Trump> cards(5); for(int k=0;k<n;k++){ int base=0; for(int i=0;i<5;i++){ string t; cin>>t; cards[i]=Trump(t); base+=pts[(int)cards[i].mark][cards[i].val-1]; } cout << ans[checkpoker(cards)]*base<<endl; } } return 0; }