Hdu 4930 斗地主

  模拟题,只是想纪念下,WA到死了…… 看到好多代码都好长,其实想说不用这么暴力。

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <string>
 8 #include <queue>
 9 #include <stack>
10 #include <vector>
11 #include <map>
12 #include <set>
13 #include <functional>
14 #include <time.h>
15 
16 using namespace std;
17 
18 const int INF = 1<<30;
19 const int MAXN = 22;
20 
21 char str[2][MAXN];
22 int id[256];
23 int cnt[2][MAXN];
24 int MAX[2][5];
25 int tr[2][10];
26 
27 bool check() {
28     int len[2] = {strlen(str[0]), strlen(str[1])};
29     if (len[0]==0) return true;
30     memset(cnt, 0, sizeof(cnt));
31     memset(MAX, 0, sizeof(MAX));
32     memset(tr, 0, sizeof(tr));
33 
34     for (int i = 0; i < 2; i++) //统计每张牌出现的数量
35         for (int j = 0; j < len[i]; j++)
36             cnt[i][id[str[i][j]]]++;
37 
38     for (int k = 0; k < 2; k++) //找出最大的牌
39         for (int i = 4; i > 0; i--)
40             for (int j = 17; j > 0; j--)
41                 if (cnt[k][j]>=i) {
42                     MAX[k][i] = j;
43                     break;
44                 }
45     for (int k = 0; k < 2; k++) //3带1、2
46         for (int i = 1; i < 3; i++)
47             for (int j = 0; j < 18; j++)
48                 if (MAX[k][3]>0 && j!=MAX[k][3] && cnt[k][j]>=i)
49                     tr[k][i] = MAX[k][3];
50 
51     if (len[0]<5 && MAX[0][len[0]]>0) return true; //能出完
52     if (MAX[0][4]>0&&len[0]==6) return true; //4带2
53     if ((len[0]==4&&tr[0][1]>0)||(len[0]==5&&tr[0][2]>0)) return true; //能出完+1
54     if (cnt[0][16]>0&&cnt[0][17]>0) return true; //有王炸
55     if (cnt[1][16]>0&&cnt[1][17]>0) return false; //对方有王炸
56     if (MAX[0][4]<MAX[1][4]) return false; //对方有炸弹
57 
58     for (int i = 4; i > 0; i--)
59         if (MAX[0][i]>=MAX[1][i] && MAX[0][i]>0) //有大过对方的牌
60             return true;
61 
62     return false;
63 }
64 
65 int main() {
66     #ifdef Phantom01
67         freopen("HDU4930.txt", "r", stdin);
68     #endif //Phantom01
69 
70     id['3'] = 3;
71     id['4'] = 4;
72     id['5'] = 5;
73     id['6'] = 6;
74     id['7'] = 7;
75     id['8'] = 8;
76     id['9'] = 9;
77     id['T'] = 10;
78     id['J'] = 11;
79     id['Q'] = 12;
80     id['K'] = 13;
81     id['A'] = 14;
82     id['2'] = 15;
83     id['X'] = 16;
84     id['Y'] = 17;
85 
86     int T;
87     scanf("%d", &T);
88     gets(str[0]);
89 
90     while (T--) {
91         gets(str[0]);
92         gets(str[1]);
93         if (check()) puts("Yes");
94         else puts("No");
95     }
96 
97     return 0;
98 }
View Code

 

posted @ 2014-08-08 10:29  Phantom01  阅读(159)  评论(0编辑  收藏  举报