WEEK6 限时测试A - 掌握魔法の东东 II

2023-05-16

A - 掌握魔法の东东 II

题目描述

从瑞神家打牌回来后,东东痛定思痛,决定苦练牌技,终成赌神!
东东有 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 种牌型的方案数(按牌型编号从小到大的顺序)

Sample Input 1

5 2
1 0 3 1

Sample Output 1

0 0 0 0 8 0 12 36 0

Sample Input 2

25 4
0 0 24 3

Sample Output 2

0 2 18 0 0 644 1656 36432 113344

题解

结构体card代表一张卡牌,a是一共有多少数字,b是一共有多少花色,card_form数组是存放九种牌型现有的个数(运行过程中从0开始加),card型数组v存放的是除了东东抽到的牌之外生下了什么牌(数量有a* b-2个),card型数组cc存放的是运行过程中已经选择的卡牌(没选择完之前不满五个),card型数组c是选出五张卡牌之后复制cc的内容,便于在c中排序并检查它是哪一种牌型。
递归函数count_card产生分支,对每个牌都有选与不选两种选择,产生两个分支。count_card的参数为n和k,n表示这一步是对v[n]的选择(0<=n<a*b-2),k是该选择第几个卡牌了(3>=k<=1)。在每个函数中对第v[n]个卡牌有选择它和不选它两种情况,选择它就cc[k]=v[n],进入下一层函数count_card(n-1,k-1),不选它就直接count_card(n-1,k)。
在每进入一次count_card()函数,就检查一次k和n的值,k=0则证明东东手中的牌选满了,检查牌型,n=0证明所有的牌已经选完了,但东东的牌不够五张,不符合要求,直接返回即可。
检查五张牌的牌型时,可以直接从牌型1到牌型9依次检查,符合则card_form[i]++。也可以根据他们的构成关系(如满足1就一定满足4和5),使用多重条件语句检查牌型。
判断多个数的相等时,不能用a= =b= =c而应该用a= =b&&b= =c。

代码

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
struct card{
	int a,b;//一共有数字 花色 
	bool operator<(const card&c)const{
		return a<c.a;
	}
}; 
int a,b;//数字 花色 
int card_form[10];//1~9:9种牌型 
vector<card>v;
card cc[6];//1~5
vector<card>c;

bool yidui(){
	if(c[0].a==c[1].a){
		return 1;
	}else if(c[2].a==c[1].a){
		return 1;
	}else if(c[3].a==c[2].a){
		return 1;
	}else if(c[4].a==c[3].a){
		return 1;
	}else{return 0;}
}
bool liangdui(){
	if(c[1].a==c[0].a&&c[3].a==c[2].a){
		return 1;
	}else if(c[2].a==c[1].a&&c[4].a==c[3].a){
		return 1;
	}else if(c[3].a==c[4].a&&c[1].a==c[0].a){
		return 1;
	}else{return 0;}
}
bool santiao(){
	if((c[1].a==c[0].a&&c[2].a==c[1].a)||(c[1].a==c[2].a&&c[2].a==c[3].a)||(c[2].a==c[4].a&&c[4].a==c[3].a)){
		return 1;
	}else{return 0;}
}
bool shunzi(){
	int tmp=c[0].a;
	for(int i=1;i<5;i++){
		if(c[i].a==tmp+1){
			tmp=c[i].a;
		}else{return 0;}
	}
	return 1;
}
bool tonghua(){
	int tmp=c[0].b;
	for(int i=1;i<5;i++){
		if(c[i].b!=tmp){return 0;}
	}
	return 1;
}
bool sandaier(){
	if((c[1].a==c[0].a&&c[3].a==c[4].a&&c[4].a==c[2].a)||(c[4].a==c[3].a&&c[0].a==c[2].a&&c[1].a==c[2].a)){
		return 1;
	}else{return 0;}
}
bool zhadan(){
	if(c[1].a==c[2].a&&c[2].a==c[3].a&&c[2].a==c[0].a||c[1].a==c[2].a&&c[2].a==c[3].a&&c[2].a==c[4].a){
		return 1;
	}else{return 0;}
}
void count_card(int n,int k){//k是还能选几张牌,n是还剩几张牌
	if(k==0){
		while(!c.empty()){c.pop_back();}
		for(int i=1;i<=5;i++){
			c.push_back(cc[i]);
		}
		sort(c.begin(),c.end());
		if(yidui()){
			if(liangdui()){
				if(zhadan()){
					card_form[2]++;
				}else if(sandaier()){
					card_form[3]++;
				}else{
					card_form[7]++;
				}
			}else if(santiao()){
				card_form[6]++;
			}
			else{
				card_form[8]++;
			}
		}
		else if(tonghua()){
			if(shunzi()){
				card_form[1]++;
			}else{
				card_form[4]++;
			}
		}
		else if(shunzi()){
			card_form[5]++;
		}else{
			card_form[9]++;
		}
		return;
	}
	if(n<=-1){return;}
	cc[k].a=v[n].a; cc[k].b=v[n].b;
	count_card(n-1,k-1);
	
	count_card(n-1,k);
}

int main(int argc, char** argv) {
	scanf("%d%d",&a,&b);
	scanf("%d%d%d%d",&cc[4].a,&cc[4].b,&cc[5].a,&cc[5].b);
	for(int i=0;i<a;i++){
		for(int j=0;j<b;j++){
			if((cc[4].a==i&&cc[4].b==j)||(cc[5].a==i&&cc[5].b==j)){
				continue;
			}
			card tmp={i,j};
			v.push_back(tmp); 
		}
	}
	count_card(a*b-3,3);
	for(int i=1;i<=9;i++){
		printf("%d ",card_form[i]);
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WEEK6 限时测试A - 掌握魔法の东东 II 的相关文章

  • 实时渲染和离线渲染

    实时渲染和离线渲染 1 实时渲染2 离线渲染3 对比 1 实时渲染 实时渲染指的是一边计算画面 xff0c 一边输出显示 特点是 xff1a 能实时操控 实时交互 xff0c 并且以极高的速度将3D图像处理了 xff0c 同时实现了逼真的效
  • Linux中crontab的坑爹环境变量问题

    手动在CentOS中执行sh脚本 xff0c 调用java程序 xff0c 一切正常 xff1b 将该sh加入crontab中定时调度之后 xff0c 挂了 xff0c 完全没有执行到的感觉啊 xff01 xff01 xff01 查看cro
  • Win32窗口

    Win32窗口 span class token comment windows 开发所需头文件 包含Windows开发所需要的宏 类 函数 结构体等结构的定义 span span class token macro property sp
  • MFC按钮禁用实现

    MFC按钮禁用 m Bn xxx span class token punctuation span span class token function EnableWindow span span class token punctuat
  • MFC屏幕截图

    屏幕截图 实现屏幕截图 xff0c 并保存多张图片 截图的效果 span class token keyword void span span class token class name CMFCApplication1Dlg span
  • obj模型文件的格式

    obj模型的格式 带纹理的obj模型mtl材质文件推荐参考库文件tiny obj loaderassimp 带纹理的obj模型 一般带纹理的obj模型需要有以下三个文件 xff0c 分别是 obj文件 xff0c mtl纹理库文件 xff0
  • n维顶点模板类

    span class token keyword template span span class token operator lt span span class token keyword int span nD span class

随机推荐

  • MFC鼠标移入移出操作

    MFC鼠标移入移出 span class token keyword void span span class token class name CMFCApplication3Dlg span span class token doubl
  • 目标物体缩放方法

    目标物体缩放方法 1 移动相机位置改变视场角 1 移动相机位置 最容易想到的方法是通过改变相机的位置 xff0c 将相机靠近或者远离目标物体从而实现物体大小的放大或者缩小 如下图所示 xff1a 改变视场角 视场角FOV xff08 Fie
  • gamma校正

    伽玛校正 xff08 Gamma Correction xff09 校正的目的输入转至线性空间输出前进行校正衰减 校正的目的 保证所有的输入都转换到线性空间 xff0c 并在线性空间下做各种光照计算 xff08 线性空间进行操作 xff09
  • d3d11释放问题

    d3d11释放问题 释放过程中遇到明明已经调用release xff08 xff09 但是内存却没有下降 xff0c 后来查看了其计数器n发现其不为0 xff0c 也就是没释放干净 xff0c 只是内部引用数减1 span class to
  • imgui显示中文

    imgui显示中文 首先先加载中文字体 span class token comment Load Fonts span io span class token punctuation span Fonts span class token
  • serialVersionUID作用

    原文出处 xff1a 未知 Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的 在进行反序列化时 xff0c JVM会把传来的字节流中的serialVersionUID与本地相应实体 xff08 类
  • linux命令与makefile学习

    linux命令与makefile学习 文件权限通配符 常用命令查看CPU 内存占用makefilegcc与g 43 43 区别 xff1a Linux上有一句话 xff1a 一切皆文件 普通文件 目录文件 d xff08 directory
  • VS在输出窗口显示信息

    输出窗口的信息传给函数 xff0c 函数内部调用系统函数OutputDebugString xff0c 就可以把调试信息打印到输出窗口 span class token keyword void span span class token
  • 使用 nlohmann 解析 json 文件

    使用 nlohmann 解析 json 文件 nlohmann json的配置json基本数据结构json文件的读取 构造与输出C 43 43 对象与nlohmann json对象的转换C 43 43 对象转换成nlohmann json对
  • ImGui实现Button高亮

    ImGui实现Button高亮 记录下在ImGui中实现Button高亮的操作 xff0c 跟着官方demo走没看到具体的实现方式 xff0c 想着渲染是不断进行的 xff0c 让下一帧绘制上次选择的状态 结果如下 xff1a 部分代码 s
  • HLSL笔记

    常量缓冲区 Constant Buffer 常量缓冲区允许C 43 43 端将数据传递给HLSL中使用 xff0c 在HLSL端 xff0c 这些传递过来的数据不可更改 xff0c 因而是常量 常量缓冲区对这种使用方式有所优化 xff0c
  • opengl shader实现Bezier曲线

    opengl shader实现Bezier曲线 顶点着色器片段着色器向shader传递数据 顶点着色器 span class token keyword const span span class token keyword char sp
  • windows创建窗口

    windows创建窗口 CreateWindowW创建窗口句柄窗口可以调节尺寸以及移动完整代码窗口的效果创建指定画面大小 xff0c 不包含窗口栏尺寸且无法调整尺寸的窗口思考 一般来讲 xff0c 要绘制或者渲染目标物体首先需要创建窗口 x
  • makefile文件解释

    makefile文件解释 makefile文件详细解释 makefile文件 CC span class token operator 61 span g 43 43 PROGRAM span class token operator 61
  • python实现自动化鼠标点击

    python实现自动化鼠标点击 span class token keyword import span pyautogui span class token keyword import span time span class toke
  • opengles共享纹理

    OpenGL ES 3 0中引入的 外部纹理 xff08 External Textures xff09 扩展 xff0c 允许将OpenGL纹理对象绑定到由外部API创建的纹理对象 xff0c 例如相机采集到的图像 视频流或其他图像数据
  • https 证书工具 Letsencrypt 简单教程

    https取代http是大势所趋 xff0c https的好处本文不在赘述 xff0c 很多公司和机构都在推进这一进程 xff0c Apple公司甚至规定 xff0c iOS上的App应用必须使用https 因此 xff0c 正是受到App
  • Linux简单命令使用笔记

    之前一直用虚拟机 xff0c 其实购买一台阿里云服务器学习linxu更加的方便快捷 阿里云服务器购买 1 electerm连接登录linux SecureCRT和SFTP 最近linux连接工具electerm 上面是两款不同的连接linu
  • 软件工程的十大模型

    1 软件生命周期模型 软件生命周期由软件定义 软件开发与运维 xff08 也称软件维护 xff09 3个时期组成 xff0c 每个时期又进一步划分成若干个阶段 问题定义 xff1a 要解决的问题是什么 xff1f 通过对客户的访问调查 xf
  • WEEK6 限时测试A - 掌握魔法の东东 II

    A 掌握魔法 东东 II 题目描述 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是