掌握魔法的东东II Gym - 101510B

2023-05-16

题意:

从瑞神家打牌回来后,东东痛定思痛,决定苦练牌技,终成赌神!
东东有 A × B 张扑克牌。每张扑克牌有一个大小(整数,记为a,范围区间是 0 到 A - 1)和一个花色(整数,记为b,范围区间是 0 到 B - 1。
扑克牌是互异的,也就是独一无二的,也就是说没有两张牌大小和花色都相同。
“一手牌”的意思是你手里有5张不同的牌,这 5 张牌没有谁在前谁在后的顺序之分,它们可以形成一个牌型。 我们定义了 9 种牌型,如下是 9 种牌型的规则,我们用“低序号优先”来匹配牌型,即这“一手牌”从上到下满足的第一个牌型规则就是它的“牌型编号”(一个整数,属于1到9):
1、同花顺: 同时满足规则 5 和规则 4.
2、炸弹 : 5张牌其中有4张牌的大小相等.
3、三带二 : 5张牌其中有3张牌的大小相等,且另外2张牌的大小也相等.
4、同花 : 5张牌都是相同花色的.
5、顺子 : 5张牌的大小形如 x, x + 1, x + 2, x + 3, x + 4
6、三条: 5张牌其中有3张牌的大小相等.
7、两对: 5张牌其中有2张牌的大小相等,且另外3张牌中2张牌的大小相等.
8、一对: 5张牌其中有2张牌的大小相等.
9、要不起: 这手牌不满足上述的牌型中任意一个.
现在, 东东从A × B 张扑克牌中拿走了 2 张牌!分别是 (a1, b1) 和 (a2, b2). (其中a表示大小,b表示花色)
现在要从剩下的扑克牌中再随机拿出 3 张!组成一手牌!!
其实东东除了会打代码,他业余还是一个魔法师,现在他要预言他的未来的可能性,即他将拿到的“一手牌”的可能性,我们用一个“牌型编号(一个整数,属于1到9)”来表示这手牌的牌型,那么他的未来有 9 种可能,但每种可能的方案数不一样。
现在,东东的阿戈摩托之眼没了,你需要帮他算一算 9 种牌型中,每种牌型的方案数。

Input
第 1 行包含了整数 A 和 B (5 ≤ A ≤ 25, 1 ≤ B ≤ 4).
第 2 行包含了整数 a1, b1, a2, b2 (0 ≤ a1, a2 ≤ A - 1, 0 ≤ b1, b2 ≤ B - 1, (a1, b1) ≠ (a2, b2)).
Output
输出一行,这行有 9 个整数,每个整数代表了 9 种牌型的方案数(按牌型编号从小到大的顺序)

Examples
Input
5 2
1 0 3 1
Output
0 0 0 0 8 0 12 36 0

Input
25 4
0 0 24 3
Output
0 2 18 0 0 644 1656 36432 113344


思路:

这道题是为了判断我们拿到五张牌之后牌所能满足上述9种牌型的各自的方案数,于是题目转化成了: 求拿到手的五张牌的所有情况 + 判断每种情况属于哪种方案。

如何求得所有情况,我们可以采用dfs的思想。定义一个结构体表示牌,里面有他的花色和牌面。我们在dfs递归的时候,用一个数字表示牌,牌的牌面是number % A,牌的花色是number / A,设立一个结构体数组存储拿到手的牌,dfs函数的参数有两个一个是现在在数组的哪个位置now(最初是2,即第一次讨论的是牌被不被放在card[2]的位置,因为0和1已经给题目要求中的两张牌占据了),以及现在讨论的哪张牌number,若是这个牌入数组,则递归dfs(now+1, number+1),否则是dfs(now, number+1),递归的终止条件是now为5即0到4共5张牌已经被放满,或是number大于等于A*B,这时候所有的牌已经遍历结束。注意遍历过程中碰到题目给的已经加入手牌的两张牌要跳过。

如何判断。我们可以设立一个int数组card1[5]用以记录五张牌的牌面,将他排序。同花顺就是五张牌花色一致并且card1[4] - card1[0] == 4,炸弹是前4张或后四张牌面一致,三带二是前三张牌面一致后两张牌面一致,或是前两张牌面一致后三张牌面一致…,就是这样找到每种情况的规律,然后依次判断,注意满足上面的情况的可能也会满足下面的,例如同花顺一定是顺子,所有每种情况后面要加一个return。


总结:

为了判断所有可能的情况可以采用dfs的遍历思想,对于模拟题我们要发现每种情况的特点来加以判断。


代码:

#include<iostream>
#include<algorithm>
using namespace std;

struct CARD
{
	int a;//大小
	int b;//花色

	CARD(int _a = 0,int _b = 0):a(_a), b(_b){}
	CARD(const CARD&t):a(t.a),b(t.b){}

	bool operator<(const CARD& t)const
	{
		if (b != t.b)return b < t.b;
		else return a < t.a;
	}
};

CARD card[5];
long long ans[10] = { 0 };
int number = 0;
int A, B;
int a1, b1, a2, b2;


void judge()
{
	int card1[5];
	for (int i = 0; i < 5; i++)
		card1[i] = card[i].a;

	sort(card1, &card1[5]);

	if (card[0].b == card[1].b && card[0].b == card[2].b && card[0].b == card[3].b && card[0].b == card[4].b)
	{
		if (card1[4] - card1[0] == 4)
		{
			ans[1]++;//同花顺
			return;
		}
	}

	
	if ((card1[0] == card1[1] && card1[0] == card1[2] && card1[0] == card1[3])
		|| (card1[1] == card1[4] && card1[1] == card1[2] && card1[1] == card1[3]))
	{
		ans[2]++;  //炸弹
		return;
	}

	if ((card1[0] == card1[1] && card1[0] == card1[2] && card1[3] == card1[4])
		|| (card1[0] == card1[1] && card1[2] == card1[3] && card1[2] == card1[4]))
	{
		ans[3]++;//三带二
		return;
	}

	if (card[0].b == card[1].b && card[0].b == card[2].b && card[0].b == card[3].b && card[0].b == card[4].b)
	{
		ans[4]++;//同花
		return;
	}

	bool t = true;
	for (int i = 0; i < 4 && t; i++)
	{
		if (card1[i] + 1 != card1[i + 1])
			t = false;
	}
	if (t)
	{
		ans[5]++;//顺子
		return;
	}

	if ((card1[0] == card1[1] && card1[0] == card1[2])
		|| (card1[1] == card1[2] && card1[2] == card1[3]) 
		|| (card1[2] == card1[3] && card1[3]==card1[4]))
	{
		ans[6]++;//三条
		return;
	}

	if ( (card1[0] == card1[1] && card1[2] == card1[3])
		|| (card1[0] == card1[1] && card1[3] == card1[4])
		|| (card1[1] == card1[2] && card1[3] == card1[4]))

	{
		ans[7]++;//两对
		return;
	}

	if (card1[0] == card1[1] || card1[1] == card1[2] || card1[2] == card1[3] || card1[3] == card1[4])
	{
		ans[8]++;//一对
		return;
	}
	ans[9]++;

}

void dfs(int now, int number)  //number<A*B
{
	if (now == 5)
	{
		judge();
		return;
	}
	if (number == A * B)return;
	
	int _a = number % A;
	int _b = number / A;
	if (!((_a == a1 && _b == b1) || (_a == a2 && _b == b2)))
	{
		card[now] = CARD(_a, _b);
		dfs(now + 1, number + 1);
		dfs(now, number + 1);
	}
	else
	{
		dfs(now, number + 1);
	}
}


int main()
{
	cin >> A >> B;
	cin >> a1 >> b1 >> a2 >> b2;
	card[0] = CARD(a1, b1); 
	card[1] = CARD(a2, b2);
	dfs(2, 0);
	for (int i = 1; i < 10; i++)
		cout << ans[i] << " ";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

掌握魔法的东东II Gym - 101510B 的相关文章

  • Python——gym运行错误【‘function‘ object has no attribute ‘Viewer‘】解决方案

    问题描述 function object has no attribute Viewer 问题分析 gym破坏性升级 xff0c 版本不兼容 解决方案 方法一 xff1a Python Gym ImportError cannot impo
  • Week6限时大模拟 A - 掌握魔法の东东 II [Gym - 270437J]

    原题链接 https vjudge net problem Gym 270437J origin 题意 基本思路 本题数据规模不大 xff0c A B 100 A B 100
  • Gym - 102470C Lights

    Statement G i v e n v
  • Gym - 101291I Mismatched Socks(贪心)

    题目 Fred likes to wear mismatched socks This sometimes means he has to plan ahead Suppose his sock drawer has 1 red 1 blu
  • Isaac Gym(一)在Ubuntu20.04.1中安装Isaac Gym

    在Ubuntu20 04 1中安装Isaac Gym 前提1 安装 Conda1 1 下载Anaconda3安装文件1 2 运行1 3 设置路径 2 安装 Isaac Gym2 1 下载Isaac Gym安装文件2 2 解压并删除安装包2
  • ModuleNotFoundError: No module named ‘gym_minigrid‘ 解决方案

    问题描述 如题 xff0c 今天在执行以下代码时出现了题目中的bug xff1a from gym minigrid wrappers import FullyObsWrapper 查询了https www roseindia net an
  • gym ValueError: too many values to unpack (expected 4) 解决方案

    问题描述 今天在执行以下代码时出现了题述错误 xff1a new obs rew done info 61 self env step action new obs rew done info 61 self env step action
  • Week2 实验 A - 化学 Gym - 270437A

    题目 甄别烷烃基的类别 假设如上图 xff0c 这个烷烃基有6个原子和5个化学键 xff0c 6个原子分别标号1 6 xff0c 然后用一对数字 a b 表示原子a和原子b间有一个化学键 这样通过5行a b可以描述一个烷烃基 输入第一行为数
  • Gym 101028J 100541D

    Gym 100499I 这题当理解题意的时候就出现一个难题 xff0c 循环小数怎么转化为分数 xff0c 果断百度下 普及知识 xff1a 1 纯循环小数 小数点后有几位数 分母就有几个9 分子为一个循环节 如 0 345 345循环 6
  • 2016 Team Training #21 Gym 100952 A D E F J

    A 水题 题意 xff1a 两个人的时间分别是时 xff0c 分 xff0c 秒输入 xff0c 也就是让我们输出谁时间最早呗 思路 xff1a 没有思路直接上 xff0c 看手速了 xff08 我敲代码速度慢 xff09 代码如下 xff
  • 掌握魔法の东东 II Gym-270437

    题目 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 xff09 和
  • 【gym】env.render三种mode

    最近使用gym提供的小游戏做强化学习DQN算法的研究 xff0c 首先就是要获取游戏截图 xff0c 并且对截图做一些预处理 screen 61 env render mode 61 39 rgb array 39 上述代码是将游戏截图转换
  • ubuntu20.04安装 gym-gazebo

    官网流程安装 xff1a https github com erlerobot gym gazebo 一 环境与依赖 1 基本环境 xff1a ROS NoeticGazebo11 11 0 2 ROS相关依赖 xff1a sudo apt
  • RL

    Catalogue DQN Framework Application 1 1 Cartpole Introduction 1 2 Code 1 3 Result Reference DQN Framework The agent inte
  • 关于OpenAI的Gym中的step方法

    文章目录 导读 Gym的step方法 最后的话 导读 本文就只是关于step方法的参数与返回值的一个小小的学习笔记 这也是没有第一时间查官方文档而造成的时间消耗 所以 这篇博客就是逼自己查一下 Gym的step方法 既然都已经用pip下载了
  • Gym的Spaces.Discrete和Spaces.box

    原文 https www jianshu com p cb0839a4d1d3 1 OpenAI Gym安装 安装 本人环境是Ubuntu16 04 anaconda Python3 6 2 git clone https github c
  • codeforces Gym 101341 K Competitions

    Problem codeforces com gym 101341 problem K vjudge net contest 162325 problem K Meaning 有 n 场比赛 每一场有 开始时间 a 结束时间 b 价值 c
  • 强化学习实践二 :理解gym的建模思想

    David Silver的强化学习公开课有几个特点 个人感觉首要的一个特点是偏重于讲解理论 而且有时候为了讲清楚一个理论的来龙去脉 也顺带讲了很多不常用的理论 还有一个特点是小例子很多 这些例子有时候不仅是为了讲清楚一个复杂的算法 而且通过
  • 强化学习实践三 :编写通用的格子世界环境类

    gym里内置了许多好玩经典的环境用于训练一个更加智能的个体 不过这些环境类绝大多数不能用来实践前五讲的视频内容 主要是由于这些环境类的观测空间的某个维度是连续变量而不是离散变量 这是前五讲内容还未涉及到的知识 为了配合解释David Sil
  • gym 101512 BAPC 2014 I Interesting Integers

    Problem codeforces com gym 101512 attachments vjudge net contest 186506 problem I Meaning 给出一个 正整数 n 要找尽量小的 a 和 b a lt b

随机推荐

  • 【华为机试真题 Python】 放苹果

    目录 题目描述 输入 输出 示例 参考代码 题目描述 把m个同样的苹果放在n个同样的盘子里 允许有的盘子空着不放 问共有多少种不同的分法 注意 如果有7个苹果和3个盘子 5 1 1 和 1 5 1 被视为是同一种分法 数据范围 0 m 10
  • keil5 显示 No target connected

    keil5 显示 No target connected 第一 xff0c 确认上电是否正常 xff0c 板子上有电源指示灯 xff1b 就是那个红色的指示灯 第二 xff1a 长按核心板上的复位键不要松开 找到Debug xff0c 确认
  • Debian系统安装中文包

    相对于Ubuntu系统 xff0c debian系统性对来说较为原始 xff0c 不能像Ubuntu一样一键设定为中文 xff0c 这样就必须自行设定 xff1a 1 安装aptitude xff1a sudo apt span class
  • 解决Linux(Ubuntu)系统下复制粘贴文件权限不够的问题

    首先是ctrl 43 alt 43 t 打开一个终端 运行命令 sudo nautilus 就可以打开一个具有管理员权限的文件管理器 xff0c 然后就可以在不切换到管理员的条件下拷贝文件
  • 解决开机出现“CLIENT MAC ADDR”的问题

    开机自检后 xff0c 系统会出现网卡配置的提示 xff0c 此时按Shift 43 F10组合键可进入配置页面 xff0c 如果不按该组合键 xff0c 几秒后则跳入下一页面 xff0c 这里会停留一段时间 xff0c 一般是一二十秒的样
  • iOS之性能优化·提高App的编译速度

    一 前言 经过多年的开发和迭代 xff0c 我相信很多的 iOS 项目代码已经达到几十万行甚至上百万行的规模 xff0c 所使用的 Pod 库的数量可以达到几十个甚至上百个 xff0c App Store 安装包也变得越来越大 xff0c
  • iOS之性能优化·优化App界面的渲染与流畅度

    一 界面渲染流程 渲染流程分析 计算机中的显示过程通常是通过 CPU GPU 显示器协同工作来将图片显示到屏幕上 xff0c 如下图所示 xff1a 苹果为了解决图片撕裂的问题使用了 VSync 43 双缓冲区的形式 xff0c 就是显示器
  • 图像处理:傅里叶变换

    0 引言 在之前的博客 图像增强 xff0c 傅里叶变换 xff08 OpenCV 中都有用到过傅里叶变换 xff0c 但一直都不是特别理解 xff0c 现系统地学习一下 先来看一个视频 傅里叶级数与傅立叶变换 xff0c 我们了解到任何周
  • 从键盘输入10个整数,判断并输出10个数中的最大值和平均值

    include lt graphics h gt include lt conio h gt include lt stdio h gt int main int a 61 0 b 61 0 c 61 0 i 61 1 n max 61 0
  • ubuntu虚拟机忘记开机密码,重置密码

    有时我们会忘记ubuntu虚拟机的开机密码 xff0c 这是候需要我们重置密码 xff0c 步骤如下 xff1a 1 打开虚拟机 xff0c 在虚拟机启动界面出现时 xff0c 鼠标点击虚拟机启动界面 xff0c 将键盘输入定向到虚拟机 x
  • 结构体数组操作+文件读写

    一 1 声明了该结构体就声明了结构体内所有成员 include lt stdio h gt typedef struct stuInfo char name int age int num Student int main int argc
  • CEF中JavaScript与C++交互

    在CEF里 xff0c JS和Native xff08 C C 43 43 xff09 代码可以很方便的交互 xff0c 这里https bitbucket org chromiumembedded cef wiki JavaScriptI
  • 阿里云网盘内测网址

    阿里云Teambition网盘内测申请地址 这个网盘还没有开放 xff0c 想要体验的话可以申请 xff0c 通过后 xff0c 获得体验资格 网址 xff1a https form teambition net f CjQetM x fi
  • Python 创建安装包

    Version usr bin env python3 coding utf 8 64 Author forward huan 64 Time 2022 07 14 23 05 64 Description import json impo
  • IOS UITableViewCell高度自适应的那些事

    好啦 xff0c 这是一个老生常谈的问题 真的 xff0c 有时候把人气得想去搞安卓 xff0c 安卓就没得这码子事 xff5e 方案有很多 xff0c 我这里提供三种方案 其实每种自适应高度的方法都有比较适合自己的情景 xff0c 比如c
  • Sublime Text 最新注册码

    Sublime Text 最新注册码 Sublime 更新后 xff0c 很多验证码都失效了 收集了一些在 2017 09 14 测试有效的注册码 xff0c 适用于 xff1a Sublime Text 2 3 xff0c Build 2
  • 群晖NAS变成TimeMachine时间机器完成Mac备份

    如果有一台群晖Nas xff0c 那么我们可以很方便的利用他完成Mac系统的自动备份 我的群晖在路由器后面 xff0c 所以当我不再家的时候备份 xff0c 则需要使用vpn连接到群晖 接下来让我们实践出真知吧 1 在群晖nas中设置一个同
  • 如何生成ssh key,以及repo init 遇到的无法检查签名:找不到公钥 问题

    repo init 遇到 无法检查签名 找不到公钥 的问题 源文章 xff1a http blog csdn net njuitjf article details 38386941 方法一 xff1a 出现此问题是repo版本不对的问题
  • 选数问题 Gym - 270437C

    题意 xff1a 给定n个正整数 xff0c 从中选取K个数 xff0c 保证这K个数的和是S 求有多少种选择的方法 Input 第一行输入一个整数T T lt 61 100 xff0c 表示有T个测试样例 对于每个例子 xff0c 有两行
  • 掌握魔法的东东II Gym - 101510B

    题意 xff1a 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 x