蓝桥杯刷题023——机器人塔(DFS)

news2024/11/26 8:47:24

2016国赛

题目描述

X 星球的机器人表演拉拉队有两种服装,A 和 B。

他们这次表演的是搭机器人塔。

类似:

         A

       B B

     A B A

    A A B B

  B B B A B

A B A B B A

队内的组塔规则是:

A 只能站在 AA 或 BB 的肩上。

B 只能站在 AB 或 BA 的肩上。

你的任务是帮助拉拉队计算一下,在给定 A 与 B 的人数时,可以组成多少种花样的塔。

输入描述

输入一行两个整数 M,N(0<M,N≤50),分别表示 A、B 的人数,保证人数合理性。

输出描述

要求输出一个整数,表示可以产生的花样种数。

输入输出样例

输入

1 2

输出

3

题目大意

给出A,B两类机器人,让它们按—定规则堆成三角形塔,问可堆成的方案数
规则:

A只能放在AA,BB上B只能放在AB,BA上

思考:如何确定每一个方案   

  • 问题转换成:确定第一层(最下一层)的A,B分布情况即可

因为第一行确定了,第二次也随之确定(根据组塔规则),以此类推,所有的机器人的位置都是确定的。

        机器人的层数由机器人数量决定,1+2+3+...+n=\frac{n(1+n)}{2}\leq 100,n最大可取到13,所以最多13层。一个位置可以放A和B两种,所以第一层最多能放2^n=2^{13}\approx 10^4种,这个计算量不高。

A,B两个状态的表示

二进制法:
用0表示A,用1表示B
从最后一层向上递推的过程:

递推的结果符合异或运算的性质

解题思路:二进制枚举+异或运算递推

1、根据输入的A,B机器人数推算层数n:  N+M\rightarrow n
2、二进制法求底层AB的所有情况
3、对于每个底层,利用异或运算(^)不断向上递推,递推过程中根据二进制数0,1统计A,B机器人剩余未使用的个数
4、如果A,B剩余未使用的个数出现负数,或者到达最顶层时A、B机器人个数不全为0,那么这个方案无效
5、统计所有有效的方案数,即为结果

代码:

d = {}                      # 存机器人数和层数
base = 0
for i in range(1, 20):
    base += i               # 机器人数
    d[base] = i
M, N = map(int, input().split())
level = d[M + N]            # 根据机器人数算出有多少层

def dfs(cur, clv, m, n):  # cur:当前情况,clv:当前层数(最底层的机器人个数),m:剩余A的人数,n:剩余B的人数
    if m < 0 or n < 0:    # 排除出现负数的情况
        return False
    if clv == 0:          # 层数为0
        return m == n == 0
    cb = bin(cur)[2:].count('1')  # 转为二进制:0bxxxx(字符串),统计1的个数count('1')
    ca = clv - cb        # 不直接统计0的个数,因为例如001010最前面的两个0没办法计入
    m -= ca; n -= cb
    up = (cur ^ (cur >> 1)) & ((1 << (clv - 1)) - 1)  # 计算出上一层的情况
    return dfs(up, clv - 1, m, n)        # 搜索上一层(层数-1)

res = 0
for case in range(1 << level):    # 遍历2^n种情况
    if dfs(case, level, M, N):
        res += 1
print(res)

注:下面对代码up = (cur ^ (cur >> 1)) & ((1 << (clv - 1)) - 1) 进行解释

例如:cur为22(二进制位10110),clv为6

1、cur >> 1:将cur右移一位,右移一位为1011;

     1 << (clv - 1):1向左移动clv-1位,为01111

2、 (cur ^ (cur >> 1)):求上一层的情况,但最左边多出来一位

 

3、& ((1 << (clv - 1)) - 1):和一个二进制位为01111相与(&)就能去掉最左边的一位。注意“-”的优先级大于“>>”,所以需要加一个括号让<<先算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

擎创动态 | 定了!建设银行首批生态合作伙伴

1月31日&#xff0c;建设银行以“云行金融之道&#xff0c;建可信未来”为主题在北京举办“建行云”发布会&#xff0c;首批推出三大类10个云服务套餐&#xff0c;为行业提供一站式解决方案。发布会上&#xff0c;建设银行推出“云霄”生态合作计划并公布首批39家“建行云”生态…

基于vue-admin-element开发后台管理系统【技术点整理】

一、Vue点击跳转外部链接 点击重新打开一个页面窗口&#xff0c;不覆盖当前的页面 window.open(https://www.baidu.com,"_blank")"_blank" 新打开一个窗口"_self" 覆盖当前的窗口例如&#xff1a;导入用户模板下载 templateDownload() {wi…

化繁为简|中信建投基于StarRocks构建统一查询服务平台

近年来&#xff0c;在证券服务逐渐互联网化&#xff0c;以及券商牌照红利逐渐消退的行业背景下&#xff0c;中信建投不断加大对数字化的投入&#xff0c;尤其重视数据基础设施的建设&#xff0c;期望在客户服务、经营管理等多方面由经验依赖向数据驱动转变&#xff0c;从而提高…

面试阿里测开岗,面试官说我不配24K,当场拍桌子翻脸....

好家伙&#xff0c;这奇葩事可真是多&#xff0c;前两天和粉丝聊天&#xff0c;他说前段时间面试阿里的测开岗&#xff0c;最后和面试官干起来了。 我问他为什么&#xff0c;他说没啥&#xff0c;就觉得面试官太装了&#xff0c;我说要24K&#xff0c;他说太高了&#xff0c;说…

中国区注册OpenAI账号试用ChatGPT指南

OpenAI最近推出ChatGPT&#xff0c;但国内&#xff08;包括香港&#xff09;并不支持OpenAI账号注册&#xff0c;多数会提示&#xff1a; OpenAI’s services are not available in your country. 前期准备 科学上网&#xff0c;最好是美国IP&#xff08;可以购买v屁n&#xf…

章鱼哥听歌

uboot环境变量 以下所有的命令&#xff0c;都在串口工具进行执行 ubifsmount- mount UBIFS volume ubifsumount- unmount UBIFS volume ums - Use the UMS [USB Mass Storage] usb - USB sub-system usbboot - boot from USB device version - print monit…

EasyX精准帧率控制打气球小游戏

&#x1f386;音乐分享 New Boy —— 房东的猫 之前都用Sleep&#xff08;&#xff09;来控制画面帧率&#xff0c;忽略了绘制画面的时间 如果绘制画面需要很长的时间&#xff0c;那么就不能忽略了。 并且Sleep&#xff08;&#xff09;函数也不是特别准确&#xff0c;那么就…

day3——有关java运算符的笔记

今天主要学习的内容有java的运算符 赋值运算符算数运算符关系运算符逻辑运算符位运算符&#xff08;专门写一篇笔记&#xff09;条件运算符运算符的优先级流程控制 赋值运算符 赋值运算符&#xff08;&#xff09;主要用于给变量赋值&#xff0c;可以跟算数运算符相结合&…

【✨十五天搞定电工基础】基本放大电路

本章要求1. 理解放大电路的放大作用和共发射极放大电路的性能特点&#xff1b; 2. 掌握静态工作点的估算方法和放大电路的微变等效电路分析法&#xff1b; 3. 了解放大电路输入、输出电阻和电压放大倍数的计算方法&#xff0c;了解放大电路的频率特性、 互补功率放大…

八、STM32串口通信

目录 一、串口通信 1.1串口通信物理层 1.2USB转串口模块 1.3串口通信的其他应用 1.4串口数据包的基本组成 二、串口的结构体与函数讲解 2.1串口讲解 2.2结构体讲解 2.3串口初始化函数讲解 三、串口发送字符 3.1如何配置串口的发送 3.2项目实战 四、串口的中断接收 …

一文搞懂 什么是CPU上下文?为什么要切换?如何减少切换?

最近经常有小伙伴问到的一些问题&#xff0c;比较集中的是关于CPU切换. 实际用C/C&#xff0c;go开发&#xff0c;你会特别注意内存和CPU的使用情况&#xff0c;那些对于CPU使用情况特别关注&#xff0c;或者性能特别关注的朋友可以看看这篇文章&#xff0c;相信看完结尾的示例…

二、Linux文件 - Open函数讲解实战

目录 1.Open函数讲解 2.open函数实战 2.1 man 1 ls 查询Shell命令 2.2 man 2 open 查看系统调用函数 2.3项目实战 2.3.1O_RDWR和O_CREAT 2.3.2O_APPEND的用法 1.Open函数讲解 高频使用的Linux系统调用&#xff1a;open write read close Linux自带的工具&#xf…

C语言实现五子棋(n子棋)

五子棋的历史背景&#xff1a; 五子棋起源于中国&#xff0c;是全国智力运动会竞技项目之一&#xff0c;是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子&#xff0c;下在棋盘直线与横线的交叉点上&#xff0c;先形成五子连珠者获胜。五子棋容易上手&#xff0c…

c/c++开发,无可避免的文件访问开发案例

一、缓存文件系统 ANSI C标准中的C语言库提供了fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等标准函数&#xff0c;这些函数在不同的操作系统中应该调用不同的内核API&#xff0c;从而支持开发者跨平台实现对文件的访问。 在Lin…

【九宫格坐标排列 Objective-C语言】

一、这个案例做好之后的效果如图: 1.这个下载是可以点击的,当你点击之后,弹出一个框,过一会儿,框框自动消失,这里变成“已安装” 2.那么,我现在先问大家一句话:大家认为在这一个应用里面,它包含几个控件, 3个,哪3个:一个是图片框,一个是Label,一个是按钮, 这…

python学习笔记-查看数据结构、均值、中位数、分位数、众数、离中趋势(标准差、方差、求和、偏态系数、风险系数)正态分布pdf、cdf、ppf

①引入pandas包&#xff0c;命名为pd。 import pandas as pd ②读入HR.csv数据 dfpd.read_csv(“./data/HR.csv”) ③查看是什么结构 type(df) ④查看单个类别satisfaction_level的数据结构 type(df[“satisfaction_level”]) ⑤查看均值的数据结构 type(df.mean()) …

运行Whisper笔记(1)

最近chatGPT很火&#xff0c;就去逛了一下openai的github项目。发现了这个项目。 这个项目可以识别视频中的音频&#xff0c;转换出字幕。 带着一颗好奇的心就尝试自己去部署玩一玩 跟着这篇文章一步步来进行安装&#xff0c;并且跟着这篇文章解决途中遇到的问题。 途中还会遇…

男,26岁,做了一年多的自动化测试,最近在纠结要不要转行,求指点。?

最近一个粉丝在后台问我&#xff0c;啊大佬我现在26了&#xff0c;做了做了一年多的自动化测试&#xff0c;最近在纠结要不要转行&#xff0c;求指点。首选做IT这条路&#xff0c;就是很普通的技术蓝领。对于大部分来说干一辈子问题不大&#xff0c;但是发不了什么财。如果你在…

第015天:将APP发布到应用商店(完结)

应用已经开发出来了&#xff0c;下一步我们需要思考推广方面的工作。那么如何才能让更多的用户知 道并使用我们的应用程序呢&#xff1f;在手机领域&#xff0c;最常见的做法就是将程序发布到某个应用商店中&#xff0c;这 样用户就可以通过商店找到我们的应用程序&#xff0c;…

前端修行 - 与后端配合的那些事情

最近总结一下个人作为前端&#xff0c;与后端、测试、以及产品经理、UI设计之间配合的那些事情&#xff0c;想到哪里说到哪里 1 关于正确认识项目研发一号位都是后端的这个事情 项目研发一号位&#xff0c;在有的公司可能会叫做SDM&#xff08;software development manger&am…