题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930

解题报告:斗地主,加了一个四张可以带两张不一样的牌,也可以带一对,判断打出一手牌之后,如果对手没有能够大过你的牌就输出Yes,或者如果你把手上的牌一次性打完也输出Yes,否则输出No,代码有280多行,表示光是敲代码就花了一个多小时,手速还是太慢。

1、首先判断手上的牌能不能一次打完

如果一次性打不完:

2、首先判断对方有没有一对王,有就输出No

3、判断对手有没有四张的牌,如果有,再判断自己有没有四张的牌,如果对手有自己没有就是输,如果自己有对手没有自己有就是赢,如果两个人都有就看谁的更大,如果两个人都没有,则继续判断

4、最后一步,尝试将自己的牌组合成前面的六种打法打出去,然后判断对手有没有可以大过自己的牌,如果有就继续判断,如果没有就是赢。

详细情况看代码吧,有详细的注释。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<deque>
  6. using namespace std;
  7.  
  8. void exchto(char* str,int* num) //先把输入预处理成各种牌的张数num[i]表示第i大的牌有多少张
  9. {
  10. int len = strlen(str);
  11. for(int i = ;i < len;++i)
  12. {
  13. if(str[i] >= '' && str[i] <= '')
  14. num[str[i]-''-]++;
  15. if(str[i] == 'T') num[]++;
  16. if(str[i] == 'J') num[]++;
  17. if(str[i] == 'Q') num[]++;
  18. if(str[i] == 'K') num[]++;
  19. if(str[i] == 'A') num[]++;
  20. if(str[i] == '') num[]++;
  21. if(str[i] == 'X') num[]++;
  22. if(str[i] == 'Y') num[]++;
  23. }
  24. }
  25. int judge_once(const int* num) //判断能否一次打完或者自己有Nuke的情况
  26. {
  27. if(num[] && num[]) //Nuke
  28. return ;
  29. int n = ;
  30. for(int i = ;i <= ;++i)
  31. if(num[i] != ) n++;
  32. if(n > ) return ; //牌种类数大于3不可能一次打完
  33. if(n == ) return ; //等于1一定可以一次打完
  34. if(n == )
  35. {
  36. for(int i = ;i <= ;++i)
  37. for(int j = ;j < i;++j)
  38. {
  39. if(num[i] == && num[j] >= && num[j] <= )
  40. return ;
  41. if(num[j] == && num[i] >= && num[i] <= )
  42. return ;
  43. if(num[i] == && num[j] == )
  44. return ;
  45. if(num[j] == && num[i] == )
  46. return ;
  47. }
  48. }
  49. else if(n == )
  50. {
  51. int flag = -;
  52. for(int i = ;i <= ;++i)
  53. if(num[i] == && flag == -) flag = ;
  54. else if(num[i] == && flag == ) flag = ;
  55. if(flag <= ) return ; //没有4或者有多个4张的,不行
  56. int m = ;
  57. for(int i = ;i <= ;++i)
  58. if(num[i] == ) m++;
  59. if(m == ) return ;
  60. return ;
  61. }
  62. return ;
  63. }
  64. int judge_have4(const int* num1,const int* num2) //判断双方是否存在4
  65. {
  66. int a = ,b = ;
  67. for(int i = ;i >= ;--i)
  68. if(num1[i] == )
  69. {
  70. a = i;
  71. break;
  72. }
  73. for(int i = ;i >= ;--i)
  74. if(num2[i] == )
  75. {
  76. b = i;
  77. break;
  78. }
  79. if(b != && a == ) return -; //对手有4而自己没有4张的情况
  80. if(a != && b == ) return ; //自己有4而对手没四
  81. if(a == && b == ) return ;
  82. if(a >= b) return ;
  83. else if(a < b) return -;
  84. }
  85. /////////下面尝试前六种不同的打法,如果可以用该打法赢,返回1,否则返回0
  86. int judge1(const int* num1,const int* num2)
  87. {
  88. int a = ,b = ;
  89. for(int i = ;i >= ;--i)
  90. if(num1[i] != )
  91. {
  92. a = i;
  93. break;
  94. }
  95. for(int i = ;i >= ;--i)
  96. if(num2[i] != )
  97. {
  98. b = i;
  99. break;
  100. }
  101. return a >= b; //因为双方至少有一张牌,否则要判断是否有没找到的情况
  102. }
  103. int judge2(const int* num1,const int* num2)
  104. {
  105. int a = ,b = ;
  106. for(int i = ;i >= ;--i)
  107. if(num1[i] >= )
  108. {
  109. a = i;
  110. break;
  111. }
  112. for(int i = ;i >= ;--i)
  113. if(num2[i] >= )
  114. {
  115. b = i;
  116. break;
  117. }
  118. if(a != && b == ) return ;
  119. if(a == && b == ) return ;
  120. if(a != && b != ) return a >= b;
  121. return ;
  122. }
  123. int judge3(const int* num1,const int* num2)
  124. {
  125. int a = ,b = ;
  126. for(int i = ;i >= ;--i)
  127. if(num1[i] >= )
  128. {
  129. a = i;
  130. break;
  131. }
  132. for(int i = ;i >= ;--i)
  133. if(num2[i] >= )
  134. {
  135. b = i;
  136. break;
  137. }
  138. if(a != && b == ) return ;
  139. if(a == && b == ) return ;
  140. if(a != && b != ) return a >= b;
  141. return ;
  142. }
  143. int judge4(const int* num1,const int* num2)
  144. {
  145. int a = ,b = ,c = ,d = ;
  146. for(int i = ;i >= ;--i)
  147. if(num1[i] >= )
  148. {
  149. a = i;
  150. break;
  151. }
  152. for(int i = ;i >= ;--i)
  153. if(num2[i] >= )
  154. {
  155. b = i;
  156. break;
  157. }
  158. if(a != )
  159. for(int i = ;i <= ;++i)
  160. if(i != a && num1[i] != )
  161. {
  162. c = ;
  163. break;
  164. }
  165. if(b != )
  166. for(int i = ;i <= ;++i)
  167. if(i != b && num2[i] != )
  168. {
  169. d = ;
  170. break;
  171. }
  172. if(a != && c == && (b == || d == )) return ; //当对手有三个但没有1个另外的也不满足这种打法
  173. if(a == && b == ) return ;
  174. if(a != && b != && c == && d == ) return a >= b;
  175. return ;
  176. }
  177. int judge5(const int* num1,const int* num2)
  178. {
  179. int a = ,b = ,c = ,d = ;
  180. for(int i = ;i >= ;--i)
  181. if(num1[i] >= )
  182. {
  183. a = i;
  184. break;
  185. }
  186. for(int i = ;i >= ;--i)
  187. if(num2[i] >= )
  188. {
  189. b = i;
  190. break;
  191. }
  192. if(a != )
  193. for(int i = ;i <= ;++i)
  194. if(i != a && num1[i] >= )
  195. {
  196. c = ;
  197. break;
  198. }
  199. if(b != )
  200. for(int i = ;i <= ;++i)
  201. if(i != b && num2[i] >= )
  202. {
  203. d = ;
  204. break;
  205. }
  206. if(a != && c == && (b == || d == )) return ; //当对手有三个但没有1个另外的也不满足这种打法
  207. if(a == && b == ) return ;
  208. if(a != && b != && c == && d == ) return a >= b;
  209. return ;
  210. }
  211. int judge6(const int* num1,const int* num2)
  212. {
  213. int a = ,b = ,c = ,d = ;
  214. for(int i = ;i >= ;--i)
  215. if(num1[i] >= )
  216. {
  217. a = i;
  218. break;
  219. }
  220. for(int i = ;i >= ;--i)
  221. if(num2[i] >= )
  222. {
  223. b = i;
  224. break;
  225. }
  226. if(a != )
  227. for(int i = ;i <= ;++i)
  228. if(i != a && num1[i] >= )
  229. c++;
  230. if(b != )
  231. for(int i = ;i <= ;++i)
  232. if(i != b && num2[i] >= )
  233. d++;
  234. if(a != && c >= && b == ) return ;
  235. if(a == && b == ) return ;
  236. if(a != && b != && c >= && d >= ) return a >= b;
  237. return ;
  238. }
  239.  
  240. int main()
  241. {
  242. // freopen("1003.txt","r",stdin);
  243. // freopen("out1.txt","w",stdout);
  244. int T;
  245.  
  246. char one[],two[];
  247. int num1[],num2[];
  248. scanf("%d",&T);
  249. while(T--)
  250. {
  251. scanf("%s%s",one,two);
  252. memset(num1,,sizeof(num1));
  253. memset(num2,,sizeof(num2));
  254. exchto(one,num1);
  255. exchto(two,num2);
  256. if(judge_once(num1)) //判断能否一次打完
  257. {
  258. puts("Yes");
  259. continue;
  260. }
  261. if(num2[] && num2[]) //对手有Nuke直接输
  262. {
  263. puts("No");
  264. continue;
  265. }
  266. int tt1 = judge_have4(num1,num2); //判断双方是否存在4
  267. ///////直接赢返回1,直接输返回-1,还有希望返回0
  268. if(tt1 == || tt1 == -) //可以判断出结果
  269. {
  270. printf(tt1 == ? "Yes\n":"No\n");
  271. continue;
  272. }
  273. /////////下面尝试前六种不同的打法,如果可以用该打法赢,返回1,否则返回0
  274. int flag = ;
  275. flag = max(flag,judge1(num1,num2));
  276. flag = max(flag,judge2(num1,num2));
  277. flag = max(flag,judge3(num1,num2));
  278. flag = max(flag,judge4(num1,num2));
  279. flag = max(flag,judge5(num1,num2));
  280. flag = max(flag,judge6(num1,num2));
  281. printf(flag? "Yes\n":"No\n");
  282. }
  283. return ;
  284. }

HDU 4930 Fighting the Landlords(模拟)的更多相关文章

  1. HDU 4930 Fighting the Landlords(暴力枚举+模拟)

    HDU 4930 Fighting the Landlords 题目链接 题意:就是题中那几种牌型.假设先手能一步走完.或者一步让后手无法管上,就赢 思路:先枚举出两个人全部可能的牌型的最大值.然后再 ...

  2. HDU 4930 Fighting the Landlords(扯淡模拟题)

    Fighting the Landlords 大意: 斗地主... . 分别给出两把手牌,肯定都合法.每张牌大小顺序是Y (i.e. colored Joker) > X (i.e. Black ...

  3. HDU 4930 Fighting the Landlords --多Trick,较复杂模拟

    题意:两个人A和B在打牌,只有题目给出的几种牌能出若A第一次出牌B压不住或者A一次就把牌出完了,那么A赢,输出Yes,否则若A牌没出完而且被B压住了,那么A输,输出No. 解法:知道规则,看清题目,搞 ...

  4. 2014多校第六场 1010 || HDU 4930 Fighting the Landlords (模拟)

    题目链接 题意 : 玩斗地主,出一把,只要你这一把对方要不了或者你出这一把之后手里没牌了就算你赢. 思路 : 一开始看了第一段以为要出很多次,实际上只问了第一次你能不能赢或者能不能把牌出尽. #inc ...

  5. hdu 4930 Fighting the Landlords--2014 Multi-University Training Contest 6

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 Fighting the Landlords Time Limit: 2000/1000 MS ...

  6. HDU4930 Fighting the Landlords 模拟

    Fighting the Landlords Fighting the Landlords Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  7. hdu4930 Fighting the Landlords(模拟 多校6)

    题目链接:pid=4930">http://acm.hdu.edu.cn/showproblem.php? pid=4930 Fighting the Landlords Time L ...

  8. HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011亚洲北京赛区网络赛)

    HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011 亚洲北京赛区网络赛题目) Eliminate Witches! Time Limit: 2000/1000 ...

  9. hdu 4930 斗地主恶心模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4930 就是两个人玩斗地主,有8种牌型,单张,一对,三张,三带一,三带对,四带二,四炸,王炸.问先手能否一次出完牌 ...

随机推荐

  1. map转json

    if (javaObject instanceof Map) { Map<Object, Object> map = (Map<Object, Object>) javaObj ...

  2. nginx 学习笔记(9) 配置HTTPS服务器--转载

    HTTPS服务器优化SSL证书链合并HTTP/HTTPS主机基于名字的HTTPS主机带有多个主机名的SSL证书主机名指示兼容性 配置HTTPS主机,必须在server配置块中打开SSL协议,还需要指定 ...

  3. CentOS7搭建hadoop2.6.4双节点集群

    环境: CentOS7+SunJDK1.8@VMware12. NameNode虚拟机节点主机名:master,IP规划:192.168.23.101,职责:Name node,Secondary n ...

  4. C# vs C++ Performance

    http://www.codeproject.com/Articles/212856/Head-to-head-benchmark-Csharp-vs-NET

  5. php瀑布流,把一个数组分4个数组,按照时间排序

    简单介绍:把一个数组分成4个数组,取其中1的倍数 <?php $arr = array( ', ', ', ', ', ', ', ', ', ', ', ', ', ); foreach($a ...

  6. linux win 通用的获取Mac的方法

    经测试下面方法获取Mac跨平台 protected override void OnLoad(EventArgs e) { Response.Write(string.Join("<b ...

  7. osharp3引入事务后操作结果类别的调整

    /// <summary> /// 表示业务操作结果的枚举, /// 对于业务务操作单元的影响只有二种状态, /// 成功,无变化: 操作将继续,事务将继续 /// 失败:将导致 操作被中 ...

  8. zabbix安装全过程

    在了解<zabbix硬件.软件需求>之后,在你心里应该有备选的机器.今天开始安装zabbix.zabbix需要LNMP或者LAMP环境.环境的搭建不在本章范围内. LNMP环境配置Linu ...

  9. IOS开发中@2x图片等适应不同分辨率手机

    开发中,例如: nanshanImage.image=[UIImage imageNamed:@'index_pic.png']; 在项目中还保存中index_pic@2x.png的图片,此图为了只适 ...

  10. 深入理解JS的delete

    原文链接: Understanding delete原文作者: Kangax原文日期: 2010年01月10日 翻译日期: 2014年02月07日 翻译人员: 铁锚 !!!!!!!!草稿版本的翻译完成 ...