牌型种数|2015年蓝桥杯B组题解析第七题-fishers
牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
答案:3598180
思路一:暴力法,12层循环枚举取得各个牌得数量(想不到其它方法,这种方法最有效!)
思路二:递归求组合数,从52张牌中选出13张,
代码一:暴力枚举
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a[13];
static int count;
int ans = 0;
for(a[0]=0; a[0]<=4; a[0]++)
{
for(a[1]=0; a[1]<=4; a[1]++)
{
for(a[2]=0; a[2]<=4; a[2]++)
{
for(a[3]=0; a[3]<=4; a[3]++)
{
for(a[4]=0; a[4]<=4; a[4]++)
{
for(a[5]=0; a[5]<=4; a[5]++)
{
for(a[6]=0; a[6]<=4; a[6]++)
{
for(a[7]=0; a[7]<=4; a[7]++)
{
for(a[8]=0; a[8]<=4; a[8]++)
{
for(a[9]=0; a[9]<=4; a[9]++)
{
for(a[10]=0; a[10]<=4; a[10]++)
{
for(a[11]=0; a[11]<=4; a[11]++)
{
for(a[12]=0; a[12]<=4; a[12]++)
{
if(a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8]+a[9]+a[10]+a[11]+a[12]==13)
{
count++;
ans = count;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
cout<<ans<<endl;
return 0;
}
代码二:dfs,递归求组合数,
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int sum=0;
//两个参数:pos表示牌的号码1~13 cnt表示当前选择的是第几张牌
//从第1号牌 开始选第一张
void dfs(int pos, int cnt){
//选够了13张牌 sum总数加1
if(cnt==14){
sum++;
return;
}
//选到第14号牌了 还没有选够13张 return
if(pos==14){
return;
}
int num=min(14-cnt,4);//min取两者中的小值 这句话剪枝!
for(int i=0;i<=num;i++){
dfs(pos+1,cnt+i); //cnt+i表示当前手里已经选好的牌的数目
}
return;
}
int main(){
dfs(1,1); //增加参数 2个参数:从第1号牌 开始选第一张 不选、选1张...选4张
printf("%d\n",sum);
return 0;
}
代码三:dfs回溯,(超时)。
#include<iostream>
using namespace std;
//回溯法:按字典序选择,但是会超时!
int have[20];
int sum = 0;
int a[15];
void init(){
for(int i=1;i<=14;i++){
have[i] = 0;
}
}
//下面是错误写法:时间复杂度太高 n^n 这里是5^13次方(10亿)
//递归程序中不能有太多循环!
void dfs(int k){
if(k==5){
//判断是否有这个组合
sum++;
for(int j=1;j<14;j++){
cout<<a[j]<<" ";
}
cout<<endl;
return;
}
//循环13次 时间复杂度太高
for(int i=1;i<=13;i++){
if(have[i] < 4){
have[i]++;
a[k] = i;
dfs(k+1);
have[i]--;
}
}
}
int main(){
init();
dfs(1);
cout<<sum<<endl;
}
/这道题目给我的思考是,
在用暴力法(dfs递归)的时候直接多想几种可能,
多想几种方案(这里选04张牌,而不是用回溯法从113张中选)
这样可以很大程度上节约时间/
牌型种数|2015年蓝桥杯B组题解析第七题-fishers的更多相关文章
- 2015年蓝桥杯B组C/C++决赛题目
2015年第六届蓝桥杯B组C/C++国赛题目 点击查看2015年第六届蓝桥杯B组C/C++国赛题解 1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会 ...
- 2015年蓝桥杯B组C/C++决赛题解
2015年第六届蓝桥杯B组C/C++决赛题解 点击查看2015年第六届蓝桥杯B组C/C++国赛题目(不含答案) 1.积分之迷 三重循环 枚举A,B,C的值,如果满足两个条件:3个A + 7个B ...
- 第六届蓝桥杯JavaB组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520, ...
- 第六届蓝桥杯JavaA组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...
- 加法变乘法|2015年蓝桥杯B组题解析第六题-fishers
加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+...+1011+12+...+2728+29+ ...
- 星系炸弹|2015年蓝桥杯B组题解析第二题-fishers
星系炸弹 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2 ...
- 垒骰子|2015年蓝桥杯B组题解析第九题-fishers
垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...
- 移动距离|2015年蓝桥杯B组题解析第八题-fishers
移动距离 X星球居民小区的楼房全是一样的,并且按矩阵样式排列.其楼房的编号为1,2,3... 当排满一行时,从下一行相邻的楼往反方向排号. 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 4 ...
- 九数组分数|2015年蓝桥杯B组题解析第五题-fishers
九数组分数 1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. #include <stdio.h> void t ...
随机推荐
- 对Django框架架构和Request/Response处理流程的分析(转)
原文:http://blog.sina.com.cn/s/blog_8a18c33d010182ts.html 一. 处理过程的核心概念 如下图所示django的总览图,整体上把握以下django的组 ...
- SqlServer 凭据
一.理解索引的结构 索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度.使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据.微软的SQL SERVER提供了两种索引:聚集索引 ...
- 在linux下使用sqlcmd
1.curl https://packages.microsoft.com/config/rhel/6/prod.repo > /etc/yum.repos.d/mssql-release.re ...
- MySQL IFNULL()函数用法MySQL
用法说明:IFNULL(expr1,expr2) 如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2. IFNULL()返回一个数字或字符串值,取决于它被使用 ...
- Linux实验楼学习之三
查看用户 who am i or who mom likes who 命令其它常用参数 参数 说明 -a 打印能打印的全部 -d 打印死掉的进程 -m 同am i,mom likes -q 打印当前登 ...
- webpack2
中文网址:http://www.css88.com/doc/webpack2/guides/installation/
- GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/gradle-3
Could not GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/gradle-3 ...
- Linux系统——JumpServer跳板机的搭建和部署
公网源部署jumpserver跳板机 建立阿里云公网源yum仓库(服务端)[root@localhost ~]# lsanaconda-ks.cfg install.log.syslog jumpse ...
- input hidden的作用
网上辣么多blabla的,我就总结一下 1 什么是hidden hidden 是input type的一个值,叫隐藏域,官方解释:“Hidden 对象代表一个 HTML 表单中的某个隐藏输入域. 这种 ...
- Swift Optional
拆包和解包的原因: 其实所谓的 nil 就是 Optional.None, 非 nil 就是Optional.Some, 然后会通过Some(T)包装(wrap)原始值,这也是为什么在使用 Optio ...