本场比赛的三个水题之一,题意是两个玩家每人都持有一手牌,问第一个玩家是否有一种出牌方法使得在第一回和对方无牌可出。直接模拟即可,注意一次出完的情况,一开始没主意,wa了一发。
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char s[3][30]; int player[4][30]; int hashCard(char ch){ if(ch >= '3' && ch <= '9') return ch-'0'-3; if(ch == 'T') return 7; if(ch == 'J') return 8; if(ch == 'Q') return 9; if(ch == 'K') return 10; if(ch == 'A') return 11; if(ch == '2') return 12; if(ch == 'X') return 13; if(ch == 'Y') return 14; } void init(int idx){ int len = strlen(s[idx]); memset(player[idx],0,sizeof player[idx]); for(int i = 0;i < len;i ++) player[idx][hashCard(s[idx][i])] ++; } int cntNum(int idx,int num){ int ret = 0; for(int i = 0;i < 20 ;i ++) if(player[idx][i] == num) ret++; return ret; } bool isHaveCnt(int idx,int cnt){ for(int i = 0;i < 20;i ++) if(player[idx][i] == cnt) return true; return false; } bool checkOneToFour(int cnt){ bool ret = false; for(int i = 20;i >= 0;i --){ int flag = 0; if(player[1][i] < cnt) continue; for(int j = 20;j >= 0;j --){ if(player[2][j] < cnt) continue; if(j > i){ flag = 1; break; } } if(flag == 1) break; ret = true; break; } if(cntNum(1,cnt) &&ret == true && !isHaveCnt(2,4)) return true; return false; } bool isWin(){ if(player[1][13] && player[1][14]) return true; if(player[2][13] && player[2][14]) return false; for(int i = 1;i <= 4;i ++) if(checkOneToFour(i)) return true; if(!isHaveCnt(1,4) && isHaveCnt(2,4)) return false; int len1 = strlen(s[1]); int len2 = strlen(s[2]); if(len1 <= len2) return false; if(isHaveCnt(1,3)){ if(len2 == 3) return true; if((isHaveCnt(1,2) || cntNum(1,3) >1) && !isHaveCnt(2,2) && cntNum(2,3) < 2) return true; }else if(isHaveCnt(1,4)){ if(len1 == 6) return true; else return false; } return false; } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%s%s",s[1],s[2]); init(1),init(2); int flag(0); int len = strlen(s[1]); if(len <= 6){ if(len == 1) printf("Yes "),flag = 1; if(len == 2){ if(cntNum(1,2)) printf("Yes "),flag = 1; }else if(len == 3){ if(cntNum(1,3)) printf("Yes "),flag = 1; }else if((isHaveCnt(1,4) && len != 5) || (isHaveCnt(1,3) && len != 5)) printf("Yes "),flag = 1; else if(len == 5){ if(cntNum(1,2) == 1 && cntNum(1,3) == 1) printf("Yes "),flag = 1; } } if(flag) continue; if(isWin()) printf("Yes "); else printf("No "); } return 0; }