大意:
鬥地主。。。。 分別給出兩把手牌,肯定都合法。每張牌大小順序是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.核彈:大小王一起(能管所有的牌)
然後規則其實很簡單,就是你先出,如果你出了之後,手牌沒有了,輸出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\n");
continue;
}
///clear
int cnt = 0;
for(int i = 3; i <= 17; ++i){
if(Hash1[i] > 0){
cnt++;
}
}
if(cnt == 1){
printf("Yes\n");
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\n");
continue;
}
if(Hash1[t2] == 3 && Hash1[t1] == 1){
printf("Yes\n");
continue;
}
if(Hash1[t1] == 3 && Hash1[t2] == 2){
printf("Yes\n");
continue;
}
if(Hash1[t2] == 3 && Hash1[t1] == 2){
printf("Yes\n");
continue;
}
if(Hash1[t1] == 4 && Hash1[t2] == 2){
printf("Yes\n");
continue;
}
if(Hash1[t2] == 4 && Hash1[t1] == 2){
printf("Yes\n");
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\n");
continue;
}
else if(Hash1[t1] == 1 && Hash1[t2] == 4 && Hash1[t3] == 1){
printf("Yes\n");
continue;
}
else if(Hash1[t1] == 1 && Hash1[t2] == 1 && Hash1[t3] == 4){
printf("Yes\n");
continue;
}
}
if(Hash2[16] == 1 && Hash2[17] == 1){
printf("No\n");
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\n");
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\n");
}
}
}
if(flag){
printf("Yes\n");
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\n");
}
}
}
}
}
if(flag){
printf("Yes\n");
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\n");
}
}
}
if(flag){
printf("Yes\n");
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\n");
}
}
}
if(flag){
printf("Yes\n");
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\n");
}
}
}
if(flag){
printf("Yes\n");
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\n");
}
}
}
if(flag){
printf("Yes\n");
continue;
}
printf("No\n");
}
return 0;
}