HDU 4930 Fighting the Landlords(模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930
解题报告:斗地主,加了一个四张可以带两张不一样的牌,也可以带一对,判断打出一手牌之后,如果对手没有能够大过你的牌就输出Yes,或者如果你把手上的牌一次性打完也输出Yes,否则输出No,代码有280多行,表示光是敲代码就花了一个多小时,手速还是太慢。
1、首先判断手上的牌能不能一次打完
如果一次性打不完:
2、首先判断对方有没有一对王,有就输出No
3、判断对手有没有四张的牌,如果有,再判断自己有没有四张的牌,如果对手有自己没有就是输,如果自己有对手没有自己有就是赢,如果两个人都有就看谁的更大,如果两个人都没有,则继续判断
4、最后一步,尝试将自己的牌组合成前面的六种打法打出去,然后判断对手有没有可以大过自己的牌,如果有就继续判断,如果没有就是赢。
详细情况看代码吧,有详细的注释。
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<deque>
- using namespace std;
- void exchto(char* str,int* num) //先把输入预处理成各种牌的张数num[i]表示第i大的牌有多少张
- {
- int len = strlen(str);
- for(int i = ;i < len;++i)
- {
- if(str[i] >= '' && str[i] <= '')
- num[str[i]-''-]++;
- if(str[i] == 'T') num[]++;
- if(str[i] == 'J') num[]++;
- if(str[i] == 'Q') num[]++;
- if(str[i] == 'K') num[]++;
- if(str[i] == 'A') num[]++;
- if(str[i] == '') num[]++;
- if(str[i] == 'X') num[]++;
- if(str[i] == 'Y') num[]++;
- }
- }
- int judge_once(const int* num) //判断能否一次打完或者自己有Nuke的情况
- {
- if(num[] && num[]) //Nuke
- return ;
- int n = ;
- for(int i = ;i <= ;++i)
- if(num[i] != ) n++;
- if(n > ) return ; //牌种类数大于3不可能一次打完
- if(n == ) return ; //等于1一定可以一次打完
- if(n == )
- {
- for(int i = ;i <= ;++i)
- for(int j = ;j < i;++j)
- {
- if(num[i] == && num[j] >= && num[j] <= )
- return ;
- if(num[j] == && num[i] >= && num[i] <= )
- return ;
- if(num[i] == && num[j] == )
- return ;
- if(num[j] == && num[i] == )
- return ;
- }
- }
- else if(n == )
- {
- int flag = -;
- for(int i = ;i <= ;++i)
- if(num[i] == && flag == -) flag = ;
- else if(num[i] == && flag == ) flag = ;
- if(flag <= ) return ; //没有4或者有多个4张的,不行
- int m = ;
- for(int i = ;i <= ;++i)
- if(num[i] == ) m++;
- if(m == ) return ;
- return ;
- }
- return ;
- }
- int judge_have4(const int* num1,const int* num2) //判断双方是否存在4
- {
- int a = ,b = ;
- for(int i = ;i >= ;--i)
- if(num1[i] == )
- {
- a = i;
- break;
- }
- for(int i = ;i >= ;--i)
- if(num2[i] == )
- {
- b = i;
- break;
- }
- if(b != && a == ) return -; //对手有4而自己没有4张的情况
- if(a != && b == ) return ; //自己有4而对手没四
- if(a == && b == ) return ;
- if(a >= b) return ;
- else if(a < b) return -;
- }
- /////////下面尝试前六种不同的打法,如果可以用该打法赢,返回1,否则返回0
- int judge1(const int* num1,const int* num2)
- {
- int a = ,b = ;
- for(int i = ;i >= ;--i)
- if(num1[i] != )
- {
- a = i;
- break;
- }
- for(int i = ;i >= ;--i)
- if(num2[i] != )
- {
- b = i;
- break;
- }
- return a >= b; //因为双方至少有一张牌,否则要判断是否有没找到的情况
- }
- int judge2(const int* num1,const int* num2)
- {
- int a = ,b = ;
- for(int i = ;i >= ;--i)
- if(num1[i] >= )
- {
- a = i;
- break;
- }
- for(int i = ;i >= ;--i)
- if(num2[i] >= )
- {
- b = i;
- break;
- }
- if(a != && b == ) return ;
- if(a == && b == ) return ;
- if(a != && b != ) return a >= b;
- return ;
- }
- int judge3(const int* num1,const int* num2)
- {
- int a = ,b = ;
- for(int i = ;i >= ;--i)
- if(num1[i] >= )
- {
- a = i;
- break;
- }
- for(int i = ;i >= ;--i)
- if(num2[i] >= )
- {
- b = i;
- break;
- }
- if(a != && b == ) return ;
- if(a == && b == ) return ;
- if(a != && b != ) return a >= b;
- return ;
- }
- int judge4(const int* num1,const int* num2)
- {
- int a = ,b = ,c = ,d = ;
- for(int i = ;i >= ;--i)
- if(num1[i] >= )
- {
- a = i;
- break;
- }
- for(int i = ;i >= ;--i)
- if(num2[i] >= )
- {
- b = i;
- break;
- }
- if(a != )
- for(int i = ;i <= ;++i)
- if(i != a && num1[i] != )
- {
- c = ;
- break;
- }
- if(b != )
- for(int i = ;i <= ;++i)
- if(i != b && num2[i] != )
- {
- d = ;
- break;
- }
- if(a != && c == && (b == || d == )) return ; //当对手有三个但没有1个另外的也不满足这种打法
- if(a == && b == ) return ;
- if(a != && b != && c == && d == ) return a >= b;
- return ;
- }
- int judge5(const int* num1,const int* num2)
- {
- int a = ,b = ,c = ,d = ;
- for(int i = ;i >= ;--i)
- if(num1[i] >= )
- {
- a = i;
- break;
- }
- for(int i = ;i >= ;--i)
- if(num2[i] >= )
- {
- b = i;
- break;
- }
- if(a != )
- for(int i = ;i <= ;++i)
- if(i != a && num1[i] >= )
- {
- c = ;
- break;
- }
- if(b != )
- for(int i = ;i <= ;++i)
- if(i != b && num2[i] >= )
- {
- d = ;
- break;
- }
- if(a != && c == && (b == || d == )) return ; //当对手有三个但没有1个另外的也不满足这种打法
- if(a == && b == ) return ;
- if(a != && b != && c == && d == ) return a >= b;
- return ;
- }
- int judge6(const int* num1,const int* num2)
- {
- int a = ,b = ,c = ,d = ;
- for(int i = ;i >= ;--i)
- if(num1[i] >= )
- {
- a = i;
- break;
- }
- for(int i = ;i >= ;--i)
- if(num2[i] >= )
- {
- b = i;
- break;
- }
- if(a != )
- for(int i = ;i <= ;++i)
- if(i != a && num1[i] >= )
- c++;
- if(b != )
- for(int i = ;i <= ;++i)
- if(i != b && num2[i] >= )
- d++;
- if(a != && c >= && b == ) return ;
- if(a == && b == ) return ;
- if(a != && b != && c >= && d >= ) return a >= b;
- return ;
- }
- int main()
- {
- // freopen("1003.txt","r",stdin);
- // freopen("out1.txt","w",stdout);
- int T;
- char one[],two[];
- int num1[],num2[];
- scanf("%d",&T);
- while(T--)
- {
- scanf("%s%s",one,two);
- memset(num1,,sizeof(num1));
- memset(num2,,sizeof(num2));
- exchto(one,num1);
- exchto(two,num2);
- if(judge_once(num1)) //判断能否一次打完
- {
- puts("Yes");
- continue;
- }
- if(num2[] && num2[]) //对手有Nuke直接输
- {
- puts("No");
- continue;
- }
- int tt1 = judge_have4(num1,num2); //判断双方是否存在4
- ///////直接赢返回1,直接输返回-1,还有希望返回0
- if(tt1 == || tt1 == -) //可以判断出结果
- {
- printf(tt1 == ? "Yes\n":"No\n");
- continue;
- }
- /////////下面尝试前六种不同的打法,如果可以用该打法赢,返回1,否则返回0
- int flag = ;
- flag = max(flag,judge1(num1,num2));
- flag = max(flag,judge2(num1,num2));
- flag = max(flag,judge3(num1,num2));
- flag = max(flag,judge4(num1,num2));
- flag = max(flag,judge5(num1,num2));
- flag = max(flag,judge6(num1,num2));
- printf(flag? "Yes\n":"No\n");
- }
- return ;
- }
HDU 4930 Fighting the Landlords(模拟)的更多相关文章
- HDU 4930 Fighting the Landlords(暴力枚举+模拟)
HDU 4930 Fighting the Landlords 题目链接 题意:就是题中那几种牌型.假设先手能一步走完.或者一步让后手无法管上,就赢 思路:先枚举出两个人全部可能的牌型的最大值.然后再 ...
- HDU 4930 Fighting the Landlords(扯淡模拟题)
Fighting the Landlords 大意: 斗地主... . 分别给出两把手牌,肯定都合法.每张牌大小顺序是Y (i.e. colored Joker) > X (i.e. Black ...
- HDU 4930 Fighting the Landlords --多Trick,较复杂模拟
题意:两个人A和B在打牌,只有题目给出的几种牌能出若A第一次出牌B压不住或者A一次就把牌出完了,那么A赢,输出Yes,否则若A牌没出完而且被B压住了,那么A输,输出No. 解法:知道规则,看清题目,搞 ...
- 2014多校第六场 1010 || HDU 4930 Fighting the Landlords (模拟)
题目链接 题意 : 玩斗地主,出一把,只要你这一把对方要不了或者你出这一把之后手里没牌了就算你赢. 思路 : 一开始看了第一段以为要出很多次,实际上只问了第一次你能不能赢或者能不能把牌出尽. #inc ...
- 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 ...
- HDU4930 Fighting the Landlords 模拟
Fighting the Landlords Fighting the Landlords Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- hdu4930 Fighting the Landlords(模拟 多校6)
题目链接:pid=4930">http://acm.hdu.edu.cn/showproblem.php? pid=4930 Fighting the Landlords Time L ...
- HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011亚洲北京赛区网络赛)
HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011 亚洲北京赛区网络赛题目) Eliminate Witches! Time Limit: 2000/1000 ...
- hdu 4930 斗地主恶心模拟
http://acm.hdu.edu.cn/showproblem.php?pid=4930 就是两个人玩斗地主,有8种牌型,单张,一对,三张,三带一,三带对,四带二,四炸,王炸.问先手能否一次出完牌 ...
随机推荐
- map转json
if (javaObject instanceof Map) { Map<Object, Object> map = (Map<Object, Object>) javaObj ...
- nginx 学习笔记(9) 配置HTTPS服务器--转载
HTTPS服务器优化SSL证书链合并HTTP/HTTPS主机基于名字的HTTPS主机带有多个主机名的SSL证书主机名指示兼容性 配置HTTPS主机,必须在server配置块中打开SSL协议,还需要指定 ...
- CentOS7搭建hadoop2.6.4双节点集群
环境: CentOS7+SunJDK1.8@VMware12. NameNode虚拟机节点主机名:master,IP规划:192.168.23.101,职责:Name node,Secondary n ...
- C# vs C++ Performance
http://www.codeproject.com/Articles/212856/Head-to-head-benchmark-Csharp-vs-NET
- php瀑布流,把一个数组分4个数组,按照时间排序
简单介绍:把一个数组分成4个数组,取其中1的倍数 <?php $arr = array( ', ', ', ', ', ', ', ', ', ', ', ', ', ); foreach($a ...
- linux win 通用的获取Mac的方法
经测试下面方法获取Mac跨平台 protected override void OnLoad(EventArgs e) { Response.Write(string.Join("<b ...
- osharp3引入事务后操作结果类别的调整
/// <summary> /// 表示业务操作结果的枚举, /// 对于业务务操作单元的影响只有二种状态, /// 成功,无变化: 操作将继续,事务将继续 /// 失败:将导致 操作被中 ...
- zabbix安装全过程
在了解<zabbix硬件.软件需求>之后,在你心里应该有备选的机器.今天开始安装zabbix.zabbix需要LNMP或者LAMP环境.环境的搭建不在本章范围内. LNMP环境配置Linu ...
- IOS开发中@2x图片等适应不同分辨率手机
开发中,例如: nanshanImage.image=[UIImage imageNamed:@'index_pic.png']; 在项目中还保存中index_pic@2x.png的图片,此图为了只适 ...
- 深入理解JS的delete
原文链接: Understanding delete原文作者: Kangax原文日期: 2010年01月10日 翻译日期: 2014年02月07日 翻译人员: 铁锚 !!!!!!!!草稿版本的翻译完成 ...