大意:
斗地主。。。。 分别给出两把手牌,肯定都合法。每张牌大小顺序是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
发这篇博客的目的不是粘代码,代码写的实在是太挫了。。。。 要看的话只看题目描述吧。。。。就是想记录一下这个题-。- 我好无聊~
1 #include <stdio.h> 2 #include <string.h> 3 4 int Hash1[20], Hash2[20]; 5 int T; 6 char s1[20], s2[20]; 7 8 int main() 9 { 10 scanf("%d", &T); 11 while(T--){ 12 memset(Hash1, 0, sizeof(Hash1)); 13 memset(Hash2, 0, sizeof(Hash2)); 14 scanf("%s", s1); 15 int len1 = strlen(s1); 16 for(int i = 0; i < len1; ++i){ 17 if(s1[i] >= '3' && s1[i] <= '9'){ 18 Hash1[s1[i]-'0']++; 19 } 20 else if(s1[i] == 'T'){ 21 Hash1[10]++; 22 } 23 else if(s1[i] == 'J'){ 24 Hash1[11]++; 25 } 26 else if(s1[i] == 'Q'){ 27 Hash1[12]++; 28 } 29 else if(s1[i] == 'K'){ 30 Hash1[13]++; 31 } 32 else if(s1[i] == 'A'){ 33 Hash1[14]++; 34 } 35 else if(s1[i] == '2'){ 36 Hash1[15]++; 37 } 38 else if(s1[i] == 'X'){ 39 Hash1[16]++; 40 } 41 else if(s1[i] == 'Y'){ 42 Hash1[17]++; 43 } 44 } 45 // for(int i = 3; i <= 17; ++i){ 46 // printf("%d ", Hash1[i]); 47 // } 48 scanf("%s", s2); 49 int len2 = strlen(s2); 50 for(int i = 0; i < len2; ++i){ 51 if(s2[i] >= '3' && s2[i] <= '9'){ 52 Hash2[s2[i]-'0']++; 53 } 54 else if(s2[i] == 'T'){ 55 Hash2[10]++; 56 } 57 else if(s2[i] == 'J'){ 58 Hash2[11]++; 59 } 60 else if(s2[i] == 'Q'){ 61 Hash2[12]++; 62 } 63 else if(s2[i] == 'K'){ 64 Hash2[13]++; 65 } 66 else if(s2[i] == 'A'){ 67 Hash2[14]++; 68 } 69 else if(s2[i] == '2'){ 70 Hash2[15]++; 71 } 72 else if(s2[i] == 'X'){ 73 Hash2[16]++; 74 } 75 else if(s2[i] == 'Y'){ 76 Hash2[17]++; 77 } 78 } 79 // for(int i = 3; i <= 17; ++i){ 80 // printf("%d ", Hash2[i]); 81 // } 82 if(Hash1[16] == 1 && Hash1[17] == 1){ 83 printf("Yes "); 84 continue; 85 } 86 87 ///clear 88 int cnt = 0; 89 for(int i = 3; i <= 17; ++i){ 90 if(Hash1[i] > 0){ 91 cnt++; 92 } 93 } 94 if(cnt == 1){ 95 printf("Yes "); 96 continue; 97 } 98 else if(cnt == 2){ 99 int t1 = 0, t2 = 0; 100 for(int i = 3; i <= 17; ++i){ 101 if(Hash1[i] > 0){ 102 if(t1 == 0){ 103 t1 = i; 104 } 105 else { 106 t2 = i; 107 } 108 } 109 } 110 if(Hash1[t1] == 3 && Hash1[t2] == 1){ 111 printf("Yes "); 112 continue; 113 } 114 if(Hash1[t2] == 3 && Hash1[t1] == 1){ 115 printf("Yes "); 116 continue; 117 } 118 if(Hash1[t1] == 3 && Hash1[t2] == 2){ 119 printf("Yes "); 120 continue; 121 } 122 if(Hash1[t2] == 3 && Hash1[t1] == 2){ 123 printf("Yes "); 124 continue; 125 } 126 if(Hash1[t1] == 4 && Hash1[t2] == 2){ 127 printf("Yes "); 128 continue; 129 } 130 if(Hash1[t2] == 4 && Hash1[t1] == 2){ 131 printf("Yes "); 132 continue; 133 } 134 } 135 else if(cnt == 3){ 136 int t1 = 0, t2 = 0, t3 = 0; 137 for(int i = 3; i <= 17; ++i){ 138 if(Hash1[i] > 0){ 139 if(t1 == 0){ 140 t1 = i; 141 } 142 else if(t2 == 0){ 143 t2 = i; 144 } 145 else { 146 t3 = i; 147 } 148 } 149 } 150 if(Hash1[t1] == 4 && Hash1[t2] == 1 && Hash1[t3] == 1){ 151 printf("Yes "); 152 continue; 153 } 154 else if(Hash1[t1] == 1 && Hash1[t2] == 4 && Hash1[t3] == 1){ 155 printf("Yes "); 156 continue; 157 } 158 else if(Hash1[t1] == 1 && Hash1[t2] == 1 && Hash1[t3] == 4){ 159 printf("Yes "); 160 continue; 161 } 162 } 163 164 165 if(Hash2[16] == 1 && Hash2[17] == 1){ 166 printf("No "); 167 continue; 168 } 169 170 bool flag = false; 171 ///bomb 172 for(int i = 15; i >= 3; --i){ 173 if(Hash1[i] == 4){ 174 int j; 175 for(j = i+1; j <= 15; ++j){ 176 if(Hash2[j] == 4){ 177 break; 178 } 179 } 180 if(j == 16){ 181 flag = true; 182 } 183 } 184 } 185 if(flag){ 186 printf("Yes "); 187 continue; 188 } 189 190 ///Four-Dual 191 for(int i = 15; i >= 3; --i){ 192 if(Hash1[i] == 4 && len1 >= 6){ 193 int j; 194 for(j = i+1; j <= 15; ++j){ 195 if(Hash2[j] == 4 && len2 >= 6){ 196 break; 197 } 198 } 199 int k; 200 for(k = 3; k <= 15; ++k){ 201 if(Hash2[k] == 4){ 202 break; 203 } 204 } 205 if(j == 16 && k == 16){ 206 flag = true; 207 //printf("Four-Dual "); 208 } 209 } 210 } 211 if(flag){ 212 printf("Yes "); 213 continue; 214 } 215 216 ///Trio-Pair 217 for(int i = 15; i >= 3; --i){ 218 if(Hash1[i] == 3){ 219 for(int j = 3; j <= 15; ++j){ 220 if(Hash1[j] == 2){ 221 int k; 222 int t = 0; 223 for(k = i+1; k <= 15; ++k){ 224 if(Hash2[k] == 3){ 225 for(int l = 3; l <= 15; ++l){ 226 if(Hash2[l] == 2){ 227 t = 1; 228 break; 229 } 230 } 231 if(t == 1){ 232 break; 233 } 234 } 235 } 236 int p; 237 for(p = 3; p <= 15; ++p){ 238 if(Hash2[p] == 4){ 239 break; 240 } 241 } 242 if(k == 16 && p == 16){ 243 flag = true; 244 //printf("Trio-Pair "); 245 } 246 } 247 } 248 } 249 } 250 if(flag){ 251 printf("Yes "); 252 continue; 253 } 254 255 ///Trio-Solo 256 for(int i = 15; i >= 3; --i){ 257 if(Hash1[i] == 3 && len1 >= 4){ 258 int j; 259 for(j = i+1; j <= 15; ++j){ 260 if(Hash2[j] == 3 && len2 >= 4){ 261 break; 262 } 263 } 264 int k; 265 for(k = 3; k <= 15; ++k){ 266 if(Hash2[k] == 4){ 267 break; 268 } 269 } 270 if(j == 16 && k == 16){ 271 flag = true; 272 //printf("Trio-Solo "); 273 } 274 } 275 } 276 if(flag){ 277 printf("Yes "); 278 continue; 279 } 280 281 ///Trio 282 for(int i = 15; i >= 3; --i){ 283 if(Hash1[i] == 3){ 284 int j; 285 for(j = i+1; j <= 15; ++j){ 286 if(Hash2[j] >= 3){ 287 break; 288 } 289 } 290 int k; 291 for(k = 3; k <= 15; ++k){ 292 if(Hash2[k] == 4){ 293 break; 294 } 295 } 296 if(j == 16 && k == 16){ 297 flag = true; 298 //printf("Trio "); 299 } 300 } 301 } 302 if(flag){ 303 printf("Yes "); 304 continue; 305 } 306 307 ///Pair 308 for(int i = 15; i >= 3; --i){ 309 if(Hash1[i] == 2){ 310 int j; 311 for(j = i+1; j <= 15; ++j){ 312 if(Hash2[j] >= 2){ 313 break; 314 } 315 } 316 int k; 317 for(k = 3; k <= 15; ++k){ 318 if(Hash2[k] == 4){ 319 break; 320 } 321 } 322 if(j == 16 && k == 16){ 323 flag = true; 324 //printf("Pair "); 325 } 326 } 327 } 328 if(flag){ 329 printf("Yes "); 330 continue; 331 } 332 333 ///Solo 334 for(int i = 17; i >= 3; --i){ 335 if(Hash1[i] == 1){ 336 int j; 337 for(j = i+1; j <= 17; ++j){ 338 if(Hash2[j] >= 1){ 339 break; 340 } 341 } 342 int k; 343 for(k = 3; k <= 15; ++k){ 344 if(Hash2[k] == 4){ 345 break; 346 } 347 } 348 if(j == 18 && k == 16){ 349 flag = true; 350 //printf("Solo "); 351 } 352 } 353 } 354 if(flag){ 355 printf("Yes "); 356 continue; 357 } 358 printf("No "); 359 } 360 361 return 0; 362 }