首页 > 代码库 > 2014多校第六场 1010 || HDU 4930 Fighting the Landlords (模拟)

2014多校第六场 1010 || HDU 4930 Fighting the Landlords (模拟)

题目链接

题意 : 玩斗地主,出一把,只要你这一把对方要不了或者你出这一把之后手里没牌了就算你赢。

思路 : 一开始看了第一段以为要出很多次,实际上只问了第一次你能不能赢或者能不能把牌出尽。

  1 #include <cstdio>  2 #include <cstring>  3 #include <iostream>  4   5 using namespace std ;  6   7 char str1[20],str2[20] ;  8 int hash1[20],hash2[20] ;  9  10 int judge(char ch) 11 { 12     if(ch == T) 13         return 10 ; 14     else if(ch == J) 15         return 11 ; 16     else if(ch == Q) 17         return 12 ; 18     else if(ch == K) 19         return 13 ; 20     else if(ch == A) 21         return 14 ; 22     else if(ch == 2) 23         return 15 ; 24     else if(ch == X) 25         return 16 ; 26     else if(ch == Y) 27         return 17 ; 28     else return ch-0 ; 29 } 30 int one() 31 { 32     int j = 0,x[25] ; 33     for(int i = 3 ; i < 18 ; i++) 34         if(hash1[i]) 35         { 36             x[j++] = hash1[i] ; 37         } 38     if(j == 1) 39         return 1 ; 40     else if(j == 2) 41     { 42         if(hash1[16] && hash1[17]) return 1 ; 43         if(x[0] == 3 && x[1] <= 2) return 1 ; 44         if(x[0] <= 2 && x[1] == 3) return 1 ; 45         if(x[0] == 4 && x[1] == 2) return 1 ; 46         if(x[0] == 2 && x[1] == 4) return 1 ; 47     } 48     else if(j == 3) 49     { 50         if(x[1] == 1 && x[0] == 1 && x[2] == 4) return 1 ; 51         if(x[1] == 1 && x[0] == 4 && x[2] == 1) return 1 ; 52         if(x[1] == 4 && x[0] == 1 && x[2] == 1) return 1 ; 53     } 54     return 0 ; 55 } 56 int main() 57 { 58     int T ; 59     cin >> T ; 60     while(T--) 61     { 62         memset(hash1,0,sizeof(hash1)) ; 63         memset(hash2,0,sizeof(hash2)) ; 64         scanf("%s %s",str1,str2) ; 65         int len1 = strlen(str1) ; 66         int len2 = strlen(str2) ; 67         for(int i = 0 ; i < len1 ; i++) 68         { 69             hash1[judge(str1[i])] ++ ; 70         } 71         for(int i = 0 ; i < len2 ; i++) 72         { 73             hash2[judge(str2[i])] ++ ; 74         } 75         ///如果有王炸 76         if(hash1[16] && hash1[17]) 77         { 78             puts("Yes") ; 79             continue ; 80         } 81         ///如果手里的牌一次性能出完 82         if(one()) 83         { 84             puts("Yes") ; 85             continue ; 86         } 87         ///如果手里牌无法一次性出完可是对方还有王炸,一定输 88         if(hash2[16] && hash2[17]) 89         { 90             puts("No") ; 91             continue ; 92         } 93         ///如果自己有普通的炸,只要比对方大就一定赢,反之如果对方有炸自己一定输 94         int flag = 0 ; 95         for(int i = 17 ; i >= 3 ; i--) 96         { 97             if(hash1[i] == 4) 98             { 99                 flag = 1 ;100                 break ;101             }102             if(hash2[i] == 4)103             {104                 flag = -1 ;105                 break ;106             }107         }108         if(flag == 1)109         {110             puts("Yes") ;111             continue ;112         }113         else if(flag == -1)114         {115             puts("No") ;116             continue ;117         }118         ///出三张一样,可不带,可带一张,可带两张119         flag = 0 ;120         int flag1 = 0 ,flag2 = 0;121         for(int i = 17 ; i >= 3 ; i--)122         {123             if(hash1[i] == 3)124             {125                 flag1 = 1 ;126             }127             if(hash2[i] == 3)128             {129                 flag2 = 1 ;130             }131             if(flag1 && !flag2)132             {133                 flag = 1 ;134                 break ;135             }136         }137         if(flag)//不带138         {139             puts("Yes") ;140             continue ;141         }142         int a1 = 0,b1 = 0 , a2 = 0,b2 = 0 ;143         if(flag1 && flag2)144         {145             for(int i = 17 ; i >= 3 ; i--)146             {147                 if(hash1[i])148                 {149                     a1 = 1 ;150                     if(hash1[i] > 1)151                         b1 = 1 ;152                 }153                 if(hash2[i])154                 {155                     a2 = 1 ;156                     if(hash2[i] > 1)157                         b2 = 1;158                 }159             }160         }161         if(a1 && !a2)//带一张162         {163             puts("Yes");164             continue ;165         }166         if(b1 && !b2)//带两张167         {168             puts("Yes") ;169             continue ;170         }171         ///出一张172         flag = 0 ;173         for(int i = 17 ; i >= 0 ; i--)174         {175             if(hash1[i])176             {177                 flag = 1 ;178                 break ;179             }180             if(hash2[i]) break ;181         }182         if(flag)183         {184             puts("Yes") ;185             continue ;186         }187         ///出一对188         flag = 0 ;189         for(int i = 17 ; i >= 0 ; i--)190         {191             if(hash1[i] >= 2)192             {193                 flag = 1 ;194                 break ;195             }196             if(hash2[i] >= 2)197                 break ;198         }199         if(flag)200         {201             puts("Yes") ;202             continue ;203         }204         ///没有任何情况可以赢了205         puts("No") ;206     }207     return 0 ;208 }
View Code