题目链接

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

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

  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

 

posted on 2014-08-08 15:05  枫、  阅读(206)  评论(0编辑  收藏  举报