大意:
斗地主。。。
。
分别给出两把手牌,肯定都合法。每张牌大小顺序是Y (i.e. colored Joker) > X (i.e. Black & White Joker) > 2 > A (Ace) > K (King) > Q (Queen) > J (Jack) > T (10) > 9 > 8 > 7 > 6 > 5 > 4 > 3。
给你8种组合:1.单牌:一张牌
2.对子:两张同样的牌
3.三重奏(百度翻译出来的。
。
):三张同样的牌
4.三带一:三张同样的带一张牌(大小仅仅考虑前面的牌,不考虑带的)
5.三带二:三张同样的带两张牌,带的两张牌能够一样,也能够不一样(大小仅仅考虑前面的牌,不考虑带的)
6.四带二:四个同样的带两张牌。带的两张牌能够一样。也能够不一样(大小仅仅考虑前面的牌,不考虑带的)
7.炸弹:四个同样的一起出,不带不论什么东西(能管除了核弹全部的)
8.核弹:大小王一起(能管全部的牌)
然后规则事实上非常easy,就是你先出,假设你出了之后。手牌没有了,输出Yes,或者你出了之后。对方没有比你出的这一把大的,也输出Yes,剩下就是输出No了。。
。
思路:
比赛的时候一直卡1007,T到死。
。。。也没来的及管这个题。。事实上不难。。
主要注意几个坑的地方即可:
1.不能四带一。
2.炸弹能够干掉四带二
3.理解好题意什么时候输出Yes
发这篇博客的目的不是粘代码。代码写的实在是太挫了。
。
。。
要看的话仅仅看题目描写叙述吧。。。
。就是想记录一下这个题-。- 我好无聊~
#include <stdio.h> #include <string.h> int Hash1[20], Hash2[20]; int T; char s1[20], s2[20]; int main() { scanf("%d", &T); while(T--){ memset(Hash1, 0, sizeof(Hash1)); memset(Hash2, 0, sizeof(Hash2)); scanf("%s", s1); int len1 = strlen(s1); for(int i = 0; i < len1; ++i){ if(s1[i] >= '3' && s1[i] <= '9'){ Hash1[s1[i]-'0']++; } else if(s1[i] == 'T'){ Hash1[10]++; } else if(s1[i] == 'J'){ Hash1[11]++; } else if(s1[i] == 'Q'){ Hash1[12]++; } else if(s1[i] == 'K'){ Hash1[13]++; } else if(s1[i] == 'A'){ Hash1[14]++; } else if(s1[i] == '2'){ Hash1[15]++; } else if(s1[i] == 'X'){ Hash1[16]++; } else if(s1[i] == 'Y'){ Hash1[17]++; } } // for(int i = 3; i <= 17; ++i){ // printf("%d ", Hash1[i]); // } scanf("%s", s2); int len2 = strlen(s2); for(int i = 0; i < len2; ++i){ if(s2[i] >= '3' && s2[i] <= '9'){ Hash2[s2[i]-'0']++; } else if(s2[i] == 'T'){ Hash2[10]++; } else if(s2[i] == 'J'){ Hash2[11]++; } else if(s2[i] == 'Q'){ Hash2[12]++; } else if(s2[i] == 'K'){ Hash2[13]++; } else if(s2[i] == 'A'){ Hash2[14]++; } else if(s2[i] == '2'){ Hash2[15]++; } else if(s2[i] == 'X'){ Hash2[16]++; } else if(s2[i] == 'Y'){ Hash2[17]++; } } // for(int i = 3; i <= 17; ++i){ // printf("%d ", Hash2[i]); // } if(Hash1[16] == 1 && Hash1[17] == 1){ printf("Yes "); continue; } ///clear int cnt = 0; for(int i = 3; i <= 17; ++i){ if(Hash1[i] > 0){ cnt++; } } if(cnt == 1){ printf("Yes "); continue; } else if(cnt == 2){ int t1 = 0, t2 = 0; for(int i = 3; i <= 17; ++i){ if(Hash1[i] > 0){ if(t1 == 0){ t1 = i; } else { t2 = i; } } } if(Hash1[t1] == 3 && Hash1[t2] == 1){ printf("Yes "); continue; } if(Hash1[t2] == 3 && Hash1[t1] == 1){ printf("Yes "); continue; } if(Hash1[t1] == 3 && Hash1[t2] == 2){ printf("Yes "); continue; } if(Hash1[t2] == 3 && Hash1[t1] == 2){ printf("Yes "); continue; } if(Hash1[t1] == 4 && Hash1[t2] == 2){ printf("Yes "); continue; } if(Hash1[t2] == 4 && Hash1[t1] == 2){ printf("Yes "); continue; } } else if(cnt == 3){ int t1 = 0, t2 = 0, t3 = 0; for(int i = 3; i <= 17; ++i){ if(Hash1[i] > 0){ if(t1 == 0){ t1 = i; } else if(t2 == 0){ t2 = i; } else { t3 = i; } } } if(Hash1[t1] == 4 && Hash1[t2] == 1 && Hash1[t3] == 1){ printf("Yes "); continue; } else if(Hash1[t1] == 1 && Hash1[t2] == 4 && Hash1[t3] == 1){ printf("Yes "); continue; } else if(Hash1[t1] == 1 && Hash1[t2] == 1 && Hash1[t3] == 4){ printf("Yes "); continue; } } if(Hash2[16] == 1 && Hash2[17] == 1){ printf("No "); continue; } bool flag = false; ///bomb for(int i = 15; i >= 3; --i){ if(Hash1[i] == 4){ int j; for(j = i+1; j <= 15; ++j){ if(Hash2[j] == 4){ break; } } if(j == 16){ flag = true; } } } if(flag){ printf("Yes "); continue; } ///Four-Dual for(int i = 15; i >= 3; --i){ if(Hash1[i] == 4 && len1 >= 6){ int j; for(j = i+1; j <= 15; ++j){ if(Hash2[j] == 4 && len2 >= 6){ break; } } int k; for(k = 3; k <= 15; ++k){ if(Hash2[k] == 4){ break; } } if(j == 16 && k == 16){ flag = true; //printf("Four-Dual "); } } } if(flag){ printf("Yes "); continue; } ///Trio-Pair for(int i = 15; i >= 3; --i){ if(Hash1[i] == 3){ for(int j = 3; j <= 15; ++j){ if(Hash1[j] == 2){ int k; int t = 0; for(k = i+1; k <= 15; ++k){ if(Hash2[k] == 3){ for(int l = 3; l <= 15; ++l){ if(Hash2[l] == 2){ t = 1; break; } } if(t == 1){ break; } } } int p; for(p = 3; p <= 15; ++p){ if(Hash2[p] == 4){ break; } } if(k == 16 && p == 16){ flag = true; //printf("Trio-Pair "); } } } } } if(flag){ printf("Yes "); continue; } ///Trio-Solo for(int i = 15; i >= 3; --i){ if(Hash1[i] == 3 && len1 >= 4){ int j; for(j = i+1; j <= 15; ++j){ if(Hash2[j] == 3 && len2 >= 4){ break; } } int k; for(k = 3; k <= 15; ++k){ if(Hash2[k] == 4){ break; } } if(j == 16 && k == 16){ flag = true; //printf("Trio-Solo "); } } } if(flag){ printf("Yes "); continue; } ///Trio for(int i = 15; i >= 3; --i){ if(Hash1[i] == 3){ int j; for(j = i+1; j <= 15; ++j){ if(Hash2[j] >= 3){ break; } } int k; for(k = 3; k <= 15; ++k){ if(Hash2[k] == 4){ break; } } if(j == 16 && k == 16){ flag = true; //printf("Trio "); } } } if(flag){ printf("Yes "); continue; } ///Pair for(int i = 15; i >= 3; --i){ if(Hash1[i] == 2){ int j; for(j = i+1; j <= 15; ++j){ if(Hash2[j] >= 2){ break; } } int k; for(k = 3; k <= 15; ++k){ if(Hash2[k] == 4){ break; } } if(j == 16 && k == 16){ flag = true; //printf("Pair "); } } } if(flag){ printf("Yes "); continue; } ///Solo for(int i = 17; i >= 3; --i){ if(Hash1[i] == 1){ int j; for(j = i+1; j <= 17; ++j){ if(Hash2[j] >= 1){ break; } } int k; for(k = 3; k <= 15; ++k){ if(Hash2[k] == 4){ break; } } if(j == 18 && k == 16){ flag = true; //printf("Solo "); } } } if(flag){ printf("Yes "); continue; } printf("No "); } return 0; }