首页 > 代码库 > 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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。