题意 : 玩斗地主,出一把,只要你这一把对方要不了或者你出这一把之后手里没牌了就算你赢。
思路 : 一开始看了第一段以为要出很多次,实际上只问了第一次你能不能赢或者能不能把牌出尽。
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 }
2014多校第六场 1010 || HDU 4930 Fighting the Landlords (模拟)
时间: 2024-10-16 20:50:34