hdu4930 模拟斗地主
题意:
模拟斗地主,出牌有一下规则,1张,1对,3张,3带1,3带2,炸弹(包括两个猫),4带2,这写规则,没有其他的,然后给你两幅牌,只要第一个人出了一次牌对方管不上,那么或者第一个人一次把牌都出光了,就算胜利,否则第一个人失败,记住,只出一次牌。
思路:
把所有的状态都模拟,每次都找出当前状态的最大值,如果对方管不上,那么就赢了,其他的就是注意点细节,比如大猫和小猫,还有就是炸弹什么的,今天做了一下午这个题目,敲了很多便都wa了,后来查出来竟然是自己不了解规则,我之前一直以为4带2必须用4带2去管,不能炸,结果今天问了他们才知道,4带2已经不是炸弹了,可以直接随便拿一个炸弹炸了,哎!斗地主都不会玩,颜面何存啊!
#include<stdio.h>
#include<string.h>
int k1[500] ,k2[500];
int pai[20];
char str1[25] ,str2[25]; void ini()
{
pai[1] = 'Y' ,pai[2] = 'X' ,pai[3] = '2' ,pai[4] = 'A' ,pai[5] = 'K';
pai[6] = 'Q' ,pai[7] = 'J' ,pai[8] = 'T' ,pai[9] = '9' ,pai[10] = '8';
pai[11] = '7' ,pai[12] = '6' ,pai[13] = '5' ,pai[14] = '4' ,pai[15] = '3';
} int main ()
{
ini();
int t ,l1 ,l2 ,ok ,A ,XY ,i ,j ,Z;
scanf("%d" ,&t);
while(t--)
{
scanf("%s" ,str1) ,scanf("%s" ,str2);
l1 = strlen(str1) ,l2 = strlen(str2);
memset(k1 ,0 ,sizeof(k1));
memset(k2 ,0 ,sizeof(k2));
for(i = 0 ;i < l1 ;i ++)
k1[str1[i]] ++;
for(i = 0 ;i < l2 ;i ++)
k2[str2[i]] ++;
if(k1['X'] && k1['Y'])
{
puts("Yes");
continue;
}
k2['X'] && k2['Y'] ? XY = Z = 1 : XY = 0;
ok = Z = A = 0;
for(i = 1 ;i <= 15 ;i ++)
if(k2[pai[i]] >= 4) Z = 1;
// 1
for(i = 1 ;i <= 15 ;i ++)
{
if(k1[pai[i]] >= 1)
{
if(l1 == 1) A = 1;
int tmp = 0;
for(j = 1 ;j < i ;j ++)
if(k2[pai[j]] >= 1) tmp = 1;
if(!tmp && !Z) ok = 1;
break;
}
}
// 2
for(i = 1 ;i <= 15 ;i ++)
{
if(k1[pai[i]] >= 2)
{
if(l1 == 2) A = 1;
int tmp = 0;
for(j = 1 ;j < i ;j ++)
if(k2[pai[j]] >= 2) tmp = 1;
if(!tmp && !Z) ok = 1;
break;
}
}
//3
for(i = 1 ;i <= 15 ;i ++)
{
if(k1[pai[i]] >= 3)
{
if(l1 == 3) A = 1;
int tmp = 0;
for(j = 1 ;j < i ;j ++)
if(k2[pai[j]] >= 3) tmp = 1;
if(!tmp && !Z) ok = 1;
break;
}
}
//3-1
for(i = 1 ;i <= 15 ;i ++)
{
if(k1[pai[i]] >= 3 && l1 >= 4)
{
if(l1 == 4) A = 1;
int tmp = 0;
for(j = 1 ;j < i ;j ++)
if(k2[pai[j]] >= 3 && l2 >= 4) tmp = 1;
if(!tmp && !Z) ok = 1;
break;
}
}
//3-2
int tt1 = 0 ,tt2 = 0;
for(i = 1 ;i <= 15 ;i ++)
{
if(k1[pai[i]] >= 2) tt1 ++;
if(k2[pai[i]] >= 2) tt2 ++;
} for(i = 1 ;i <= 15 ;i ++)
{
if(k1[pai[i]] >= 3 && tt1 >= 2)
{
if(l1 == 5) A = 1;
int tmp = 0;
for(j = 1 ;j < i ;j ++)
if(k2[pai[j]] >= 3 && tt2 >= 2) tmp = 1;
if(!tmp && !Z) ok = 1;
break;
}
} //4
for(i = 1 ;i <= 15 ;i ++)
{
if(k1[pai[i]] >= 4)
{
if(l1 == 4) A = 1;
int tmp = 0;
for(j = 1 ;j < i ;j ++)
if(k2[pai[j]] >= 4) tmp = 1;
if(!tmp) ok = 1;
}
}
//4-2
for(i = 1 ;i <= 15 ;i ++)
{
if(k1[pai[i]] >= 4 && l1 >= 6)
{
if(l1 == 6) A = 1;
int tmp = 0;
for(j = 1 ;j < i ;j ++)
if(k2[pai[j]] >= 4 && l2 >= 6) tmp = 1;
if(!tmp && !Z) ok = 1;
break;
}
}
if(A) ok = 1;
if(!A && XY) ok = 0;
ok ? puts("Yes") : puts("No");
}
return 0;
}
hdu4930 模拟斗地主的更多相关文章
- Java基础知识强化之集合框架笔记71:模拟斗地主洗牌和发牌并对牌进行排序的案例
1. 模拟斗地主洗牌和发牌并对牌进行排序的原理图解: 2. 代码实现: 思路: • 创建一个HashMap集合 • 创建一个ArrayList集合 • 创建花色数组和点数数组 • 从0开始往HashM ...
- Java基础知识强化之集合框架笔记70:模拟斗地主洗牌和发牌(ArrayList)
1. 模拟斗地主洗牌和发牌 分析: A:创建一个牌盒 B:装牌 C:洗牌 D:发牌 E:看牌 2. 代码实现: package cn.itcast_03; im ...
- Map集合、HashMap集合、LinkedHashMap集合、Hashtable集合、Collections工具类和模拟斗地主洗牌和发牌
1.Map集合概述和特点 * A:Map接口概述 * 查看API可以知道: * 将键映射到值的对象 * 一个映射不能包含重复的键 * 每个键最多 ...
- 模拟斗地主和学生管理系统 IO 版
1.模拟斗地主 public class PlayCards { public static void main(String[] args) { String[] color = {"黑桃 ...
- Java 模拟斗地主
模拟斗地主 public class M1 { public static void main(String args[]) { DouDiZhu02(); } private static void ...
- java 模拟斗地主发牌洗牌
一 模拟斗地主洗牌发牌 1.案例需求 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张 ...
- 2014 HDU多校弟六场J题 【模拟斗地主】
这是一道5Y的题目 有坑的地方我已在代码中注释好了 QAQ Ps:模拟题还是练的太少了,速度不够快诶 //#pragma comment(linker, "/STACK:16777216&q ...
- java模拟斗地主发牌看牌
import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; public class Dou ...
- Java学习笔记34(集合框架八:综合案例:模拟斗地主的洗牌发牌)
规则: 1.54张扑克牌,有花色 2.顺序打乱,一人一张依次发牌,一人17张,留三张作为底牌 3.看牌:按大小王2A....43的序排列打印 示例: package demo; import java ...
随机推荐
- CVE-2018-2628-WLS Core Components 反序列化
漏洞参考 https://blog.csdn.net/csacs/article/details/87122472 漏洞概述:在 WebLogic 里,攻击者利用其他rmi绕过weblogic黑名单限 ...
- MySQL全面瓦解25:构建高性能索引(案例分析篇)
回顾一下上面几篇索引相关的文章: MySQL全面瓦解22:索引的介绍和原理分析 MySQL全面瓦解23:MySQL索引实现和使用 MySQL全面瓦解24:构建高性能索引(策略篇) 索引的十大原则 1. ...
- FreeBSD 入门 哲学与玄学
『哲学与玄学』 FreeBSD 是一种 UNIX 哲学(如模块化,一切皆文件等,见< UNIX 编程艺术>❩的发展,也是学院派的代表作品.她是一套工具集,她存在目的是为了让人们更好的生活. ...
- Vue 插槽之插槽内容学习总结
插槽内容使用方法介绍 父组件中引用支持插槽内容的子组件,形如以下(假设子组件为NavigationLink.vue) <navigation-link url="/profile&qu ...
- Java学习历程记录(一)
一.类与对象 1.创建类 创建一个学生类.并且创造成员变量和方法 public class student{ String name: int age: public void study(参数列表) ...
- mysql中的基础查询 练习
#进阶1:基础查询 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 特点: 1.查询列表可以是:表中的字段.常量值.表达式.函数 2 ...
- Flutter教程- Dart语言规范-知识点整理
Flutter教程- Dart语言知识点整理 Dart语言简介 Dart语言介绍 ① 注释的方式 ② 变量的声明 ③ 字符串的声明和使用 ④ 集合变量的声明 ⑤ 数字的处理 ⑥ 循环的格式 ⑦ 抛异常 ...
- 使用C# (.NET Core) 实现单体设计模式 (Singleton Pattern)
本文的概念内容来自深入浅出设计模式一书 由于我在给公司做内培, 所以最近天天写设计模式的文章.... 单体模式 Singleton 单体模式的目标就是只创建一个实例. 实际中有很多种对象我们可能只需要 ...
- Python 详解修饰器 附带 js使用修饰器
修饰器 功能 修饰器的主要功能是,在不改变已有代码的情况下,为某一个类,方法等扩展功能 首先看这样一段代码 def foo(): for i in range(10): print(i) foo() ...
- Android Studio 报错:你的主机中的软件中止了一个已建立的连接
•解决方案 关闭电脑的移动热点 关闭后,build 就不会报错了. 等 build 好了后,重新打开移动热点,再次 build 一就不会报错.