http://acm.hdu.edu.cn/showproblem.php?pid=4930

就是两个人玩斗地主,有8种牌型,单张,一对,三张,三带一,三带对,四带二,四炸,王炸。问先手能否一次出完牌或者出的第一手牌让对方无牌可出!!能则输出yes。

恶心模拟

8种组合: 1.单牌:一张牌

     2.对子:两张相同的牌

     3.三重奏(百度翻译出来的。。):三张相同的牌

      4.三带一:三张相同的带一张牌(大小只考虑前面的牌,不考虑带的)

      5.三带二:三张相同的带两张牌,带的两张牌可以一样,也可以不一样(大小只考虑前面的牌,不考虑带的)

      6.四带二:四个相同的带两张牌,带的两张牌可以一样,也可以不一样(大小只考虑前面的牌,不考虑带的)

      7.炸弹:四个相同的一起出,不带任何东西(能管除了核弹所有的)

      8.核弹:大小王一起(能管所有的牌)

注意: 1.4张相同的牌带两张牌的话是可以被炸弹炸的;

2.不能四带一

3.特判先手一次出完的情况

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define clr0(x) memset(x,0,sizeof(x))
typedef long long LL; int u[19], v[19], w[19];
int t,s,n,m; int id(char temp) {
if (temp=='Y') return 17;
if (temp=='X') return 16;
if (temp=='2') return 15;
if (temp=='A') return 14;
if (temp=='K') return 13;
if (temp=='Q') return 12;
if (temp=='J') return 11;
if (temp=='T') return 10;
return temp-'0';
} bool check() {
int i,j,k;
if (v[16]>=1 && v[17]>=1) {
return 1;
} if (m==2) {
if (w[16]>=1 && w[17]>=1) return 0;
} if (m==4) {
for (i=3; i<=15; ++i)
if (w[i]>=4){
//炸弹
for (j=i+1; j<=15; ++j)
if (v[j]>=4) return 1;
return 0;
}
} for (j=3; j<=15; ++j)
if (v[j]>=4) return 1; if (n<m) return 0; if (m==1) {
for (i=3; i<=17; ++i)
if (w[i]>=1){
for (j=i+1; j<=17; ++j)
if (v[j]>=1) return 1;
return 0;
}
} if (m==2) {
for (i=3; i<=15; ++i)
if (w[i]>=2) {
for (j=i+1; j<=15; ++j)
if (v[j]>=2) return 1;
return 0;
}
} if (m==3) {
for (i=3; i<=15; ++i)
if (w[i]>=3) {
for (j=i+1; j<=15; ++j)
if (v[j]>=3) return 1;
return 0;
}
} if (m==4) {
for (i=3; i<=15; ++i)
if (w[i]>=3){
//三带一
for (j=i+1; j<=15; ++j)
if (v[j]>=3) return 1;
return 0;
}
} if (m==5) {
for (i=3; i<=15; ++i)
if (w[i]>=3){
//三带对
for (j=i+1; j<=15; ++j)
if (v[j]>=3) {
break;
}
if (j>=16) return 0;
for (k=3; k<=15; ++k) {
if (k!=j && v[k]>=2) return 1;
}
return 0;
}
} return 0;
} bool solve() {
int i,j,k; if (u[16]>=1 && u[17]>=1) {
return 1;
} if (s==4 || s==6) {
for (i=3; i<=15; ++i)
if (u[i]>=4) return 1;
} if (s==1) {
return 1;
} if (s==2) {
for (i=3; i<=15; ++i)
if (u[i]>=2) return 1;
} if (s==3) {
for (i=3; i<=15; ++i)
if (u[i]>=3) return 1;
} if (s==4) {
for (i=3; i<=15; ++i)
if (u[i]>=3) return 1;
} if (s==5) {
for (i=3; i<=15; ++i)
if (u[i]>=3){
for (k=3; k<=15; ++k)
if (k!=i && u[k]>=2) return 1;
}
} for (i=3; i<=17; ++i){
if (u[i]>=4) {
clr0(w);
w[i]=u[i];
m = u[i];
if (!check()) return 1;
}
else if (u[i]>=3) {
for (j=3;j<=17;++j)
if (j!=i && u[j]>=2){
clr0(w);
w[i]=u[i];
w[j]=2;
m = u[i] + 2;
if (!check()) return 1;
}
clr0(w);
w[i]=u[i];
m = u[i];
if (!check()) return 1;
if (s>3){
for (j=3;j<=17;++j)
if (j!=i) break;
w[j]=1;
m = u[i] + 1;
if (!check()) return 1;
}
}
else if (u[i]>=2){
clr0(w);
w[i]=u[i];
m = u[i];
if (!check()) return 1;
}
else if (u[i]>=1){
clr0(w);
w[i]=u[i];
m = u[i];
if (!check()) return 1;
}
}
return 0;
} int main() {
char a[19], b[19];
int i;
RD(t);
while (t--) {
clr0(u),clr0(v);
scanf("%s", a);
s = strlen(a);
for (i = 0; i < s; ++i)
++u[id(a[i])]; scanf("%s", b);
n = strlen(b);
for (i = 0; i < n; ++i)
++v[id(b[i])];
if(solve())
puts("Yes");
else
puts("No");
}
return 0;
}

hdu 4930 斗地主恶心模拟的更多相关文章

  1. Hdu 4930 斗地主

    模拟题,只是想纪念下,WA到死了…… 看到好多代码都好长,其实想说不用这么暴力. #include <iostream> #include <cstdio> #include ...

  2. hdu 5071 vector操作恶心模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=5071 对于每一个窗口,有两个属性:优先级+说过的单词数,支持8个操作:新建窗口,关闭窗口并输出信息,聊天(置顶窗 ...

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

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

  4. HDU - 5071 Chat(模拟)

    原题链接 题意:有各种操作,模拟这个程序并输出每次操作的信息 分析:恶心模拟题...用个map记录一下各个等级女孩的谈话数,同时也便于查找权值为u的在不在队列里.因为n很小,其他就暴力模拟了. #in ...

  5. HDU 4930 Fighting the Landlords(模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 解题报告:斗地主,加了一个四张可以带两张不一样的牌,也可以带一对,判断打出一手牌之后,如果对手没 ...

  6. hdu 4964 恶心模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4964 给定语句,按照语法翻译html并输出. 就是恶心的模拟,递归搞就行了 处理id和class时,在一个'&g ...

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

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

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

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

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

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

随机推荐

  1. C# fckeditor浏览服务器和上传目录不一致,看不到上传过的文件

    fckeditor在上传标签页面,传过文件后,在浏览服务器那里,看不到之前上传的文件,通过浏览服务器页面上传文件,保存的目录也和上传标签页面上传的不是同一个文件夹. 修改方法如下: 打开fckedit ...

  2. angular2.0学习笔记2.创建hello world项目

    1.打开终端命令行窗口 2.切换到指定目录 E:\cd myobject 3.创建新项目 ng new angular2-helloworld 4.创建成功后,在angular2-helloworld ...

  3. waf相关

    google上搜索下面信息: waf site:klionsec.github.io 有几篇比较有意思的问题: https://klionsec.github.io/2017/07/09/nginx- ...

  4. POJ1966 Cable TV Network

    原题链接 割去点使得无向图不连通,和最小割相似. 我们可以将点转化成边,这样就能跑最小割了. 枚举每两个不能直接到达的点\(S,T\),使得删去一些点(除去这两个点)使得这两个点不连通(若两点能直接到 ...

  5. Selenium+PhantomJS

    Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上, ...

  6. 20172306 《Java程序设计》第二周学习总结

    20172306<Java程序设计>第二周学习总结 教材学习内容总结 这一周的学习,我觉得我比上一周认真多了,而且我突然发现慢慢学习的过程中,以前有一些多余自己打出来的东西,有了更清晰的认 ...

  7. 大神你好,可以帮我P张图吗?

    韩国版的求大神帮我P张图,看得有点下巴脱臼啊!哈哈哈哈哈哈哈~ 感觉照片拍得很尴尬,请大神P得更有动感 拍了跳跃照片,但内衣露出来一点,能帮忙去掉吗 不喜欢没穿制服的样子,请帮忙加上制服 ​ 希望背景 ...

  8. 数据结构:链表 >> 链表按结点中第j个数据属性排序(冒泡排序法)

    创建结点类,链表类,测试类 import java.lang.Object; //结点node=数据date+指针pointer public class Node { Object iprop; p ...

  9. anaconda的源配置的坑

    anaconda是一个python的科学计算的包集合,它提供了一个非常好用的包管理器 conda,类似于pip. 为了速度(不仅为了速度,没有清华源你就被墙了,速度为0),我们使用清华源: 在类uni ...

  10. Hadoop3集群搭建之——hive安装

    Hadoop3集群搭建之——虚拟机安装 Hadoop3集群搭建之——安装hadoop,配置环境 Hadoop3集群搭建之——配置ntp服务 Hadoop3集群搭建之——hbase安装及简单操作 现在到 ...