題意:兩我的A和B在打牌,只有題目給出的幾種牌能出若A第一次出牌B壓不住或者A一次就把牌出完了,那麼A贏,輸出Yes,不然若A牌沒出完並且被B壓住了,那麼A輸,輸出No。ios
解法:知道規則,看清題目,搞清有哪些Trick,就能夠直接模擬搞了。詳見代碼:ide
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <vector> #include <queue> using namespace std; #define N 100102 #define M 22 char s1[24],s2[24]; int A[24],B[24]; int cnt1[20],cnt2[20]; int main() { int n,i,j; int n1,n2; scanf("%d",&n); while(n--) { priority_queue<int> Single,Pair,Tri,Four,Nuke; priority_queue<int> Single2,Pair2,Tri2,Four2,Nuke2; scanf("%s",s1); scanf("%s",s2); n1 = strlen(s1); n2 = strlen(s2); for(i=0;i<n1;i++) { if(s1[i] >= '3' && s1[i] <= '9') A[i] = s1[i]-'0'; else if(s1[i] == 'T') A[i] = 10; else if(s1[i] == 'J') A[i] = 11; else if(s1[i] == 'Q') A[i] = 12; else if(s1[i] == 'K') A[i] = 13; else if(s1[i] == 'A') A[i] = 14; else if(s1[i] == '2') A[i] = 15; else if(s1[i] == 'X') A[i] = 16; else if(s1[i] == 'Y') A[i] = 17; } for(i=0;i<n2;i++) { if(s2[i] >= '3' && s2[i] <= '9') B[i] = s2[i]-'0'; else if(s2[i] == 'T') B[i] = 10; else if(s2[i] == 'J') B[i] = 11; else if(s2[i] == 'Q') B[i] = 12; else if(s2[i] == 'K') B[i] = 13; else if(s2[i] == 'A') B[i] = 14; else if(s2[i] == '2') B[i] = 15; else if(s2[i] == 'X') B[i] = 16; else if(s2[i] == 'Y') B[i] = 17; } sort(A,A+n1); sort(B,B+n2); memset(cnt1,0,sizeof(cnt1)); memset(cnt2,0,sizeof(cnt2)); for(i=0;i<n1;i++) //計算A各類牌的個數 cnt1[A[i]]++; for(i=0;i<n2;i++) //計算B各類牌的個數 cnt2[B[i]]++; for(i=3;i<=15;i++) { if(cnt1[i] == 4) //出現四個,能夠作四個出,能夠作三個出,也能夠作兩個或一個出 Four.push(i),Tri.push(i),Pair.push(i),Single.push(i); else if(cnt1[i] == 3) Tri.push(i),Pair.push(i),Single.push(i); else if(cnt1[i] == 2) Pair.push(i),Single.push(i); else if(cnt1[i] == 1) Single.push(i); } for(i=3;i<=15;i++) { if(cnt2[i] == 4) Four2.push(i),Tri2.push(i),Pair2.push(i),Single2.push(i); else if(cnt2[i] == 3) Tri2.push(i),Pair2.push(i),Single2.push(i); else if(cnt2[i] == 2) Pair2.push(i),Single2.push(i); else if(cnt2[i] == 1) Single2.push(i); } if(cnt1[16]) //有王,能夠作單個出 Nuke.push(16),Single.push(16); if(cnt1[17]) Nuke.push(17),Single.push(17); if(cnt2[16]) Nuke2.push(16),Single2.push(16); if(cnt2[17]) Nuke2.push(17),Single2.push(17); if(Nuke.size() >= 2) //雙王,直接贏 { puts("Yes"); continue; } //-------------------------------下面判斷可否一次出完 if(n1 == 1) { puts("Yes"); continue; } if(n1 == 2) { if(A[0] == A[1]) { puts("Yes"); continue; } } if(n1 == 3) { if(A[0] == A[1] && A[1] == A[2]) { puts("Yes"); continue; } } if(n1 == 4) { if(A[0] == A[1] && A[1] == A[2] && A[2] == A[3]) { puts("Yes"); continue; } if(A[0] != A[1] && A[1] == A[2] && A[2] == A[3]) { puts("Yes"); continue; } if(A[2] != A[3] && A[0] == A[1] && A[1] == A[2]) { puts("Yes"); continue; } } if(n1 == 5) { if(A[0] == A[1] && A[1] != A[2] && A[2] == A[3] && A[3] == A[4]) { puts("Yes"); continue; } if(A[3] == A[4] && A[2] != A[3] && A[0] == A[1] && A[1] == A[2]) { puts("Yes"); continue; } } if(n1 == 6) { int tag = 0; for(i=0;i<=2;i++) { if(A[i] == A[i+1] && A[i+1] == A[i+2] && A[i+2] == A[i+3]) { tag = 1; break; } } if(tag) { puts("Yes"); continue; } } //-----------------------------若是不能一次出完 if(Nuke2.size() >= 2) //對方有雙王,必輸 { puts("No"); continue; } if(!Nuke.empty() && Nuke2.empty()) //A有王,B沒王 { puts("Yes"); continue; } if(!Nuke.empty() && !Nuke2.empty()) //都有王,看誰的大,若是A小,則不選擇出王,繼續 { if(Nuke.top() > Nuke2.top()) { puts("Yes"); continue; } } if(Four.empty() && !Four2.empty()) //炸彈,若是不能一次出完又沒炸彈,那麼必會被炸,輸 { puts("No"); continue; } if(!Four.empty() && Four2.empty()) //有炸彈出炸彈 { puts("Yes"); continue; } if(!Four.empty() && !Four2.empty()) //都有炸彈,A的若是小,由於不能一次出完,必輸 { if(Four.top() >= Four2.top()) { puts("Yes"); continue; } else { puts("No"); continue; } } if(!Tri.empty() && Tri2.empty()) //三個的狀況 { puts("Yes"); continue; } if(!Tri.empty() && !Tri2.empty()) { if(Tri.top() >= Tri2.top()) { puts("Yes"); continue; } else if(n1 >= 4 && n2 <= 3) //A有的帶,B沒得帶 { puts("Yes"); continue; } } if(!Pair.empty() && Pair2.empty()) //對子 { puts("Yes"); continue; } if(!Pair.empty() && !Pair2.empty()) { if(Pair.top() >= Pair2.top()) { puts("Yes"); continue; } } if(Single.empty() && !Single2.empty()) //單個牌 { puts("No"); continue; } if(!Single.empty() && Single2.empty()) { puts("Yes"); continue; } if(!Single.empty() && !Single2.empty()) { if(Single.top() >= Single2.top()) { puts("Yes"); continue; } } puts("No"); //若是以上都不知足,那麼A輸了,gg。 } return 0; }