【蓝桥杯】43697.机器人塔

news/2025/2/1 12:26:21/

题目描述

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<500),分别表示 A、B 的人数,保证人数合理性。

输出描述

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

输入输出样例

示例
输入

1 2

输出

3

题目解析

  通读一遍题目,已知“初始局面”,求“未来可能的局面”的数量,不出意外的话,这又是一道关于“遍历”类型的题目,那么我们首先会考虑到 深度优先搜索DFS 或者 广度优先搜索BFS 算法。

比如说,有一个A,两个B,那么有多少种组合方式呢?
看下规则的说明:

  1. A 只能站在 AA 或 BB 的肩上。
  2. B 只能站在 AB 或 BA 的肩上。

在这个案例中,有一个A和两个B,先从A开始遍历。
如果第一行是A,那么在剩下的字符中,第二行只有BB这一种组合;
A
B B
如果第一行是B,那么在剩下的字符中,第二行可以有AB或者BA这两种组合;
B     或者      B
A B            B A
那么一共有3种组合的可能性局面。

   在这其中有一个重要的规律:如果底层相邻的两个字符相同(比如都是AA或BB),则上层对应的一定是A; 如果底层相邻的两个字符不同(比如是AB或BA),则上层对应的一定是B。

   使用DFS算法解决该问题,算法的核心目标是根据输入的 A 和 B 的数量,找出所有可能的机器人塔花样。其步骤包括:计算塔的层数、使用深度优先搜索生成所有可能的底层排列、对每个底层排列检查是否能构建出满足规则且 A、B 数量符合要求的塔,最后输出符合条件的塔的数量。

算法步骤

  1. 读取输入
    在 main 函数中,首先通过 map(int, input().split()) 读取用户输入的一行两个整数,分别赋值给变量 m 和 n,它们分别代表 A 和 B 的数量。
  2. 计算塔的层数
    根据机器人塔的结构特点,总的机器人数等于从 1 到塔层数的连续整数之和,即满足公式 total = layer * (layer + 1) // 2,其中 total = m + n。通过一个循环不断增加 layer 的值,直到找到满足该公式的层数。
  3. 深度优先搜索
       调用 dfs 函数开始深度优先搜索,初始参数为当前层(初始设为 1)、目标底层长度(即上面计算得到的塔的层数 layer)、A 和 B 的目标数量 m 和 n,以及一个空列表表示初始的底层排列。
       终止条件判断:当当前正在构建的底层排列 current_bottom 的长度达到目标底层长度 target_layer 时,说明已经生成了一个完整的底层排列。此时调用 check_tower 函数检查该底层排列是否能构建出满足条件的塔,如果满足则将全局结果计数器 result 加 1。
       递归搜索:如果底层排列还未构建完成,则分别尝试在 current_bottom 后面添加 ‘A’ 和 ‘B’,并递归调用 dfs 函数继续生成底层排列。
  4. 检查塔是否满足条件
       构建塔:从给定的底层排列 bottom 开始,根据组塔规则逐层向上构建塔。对于每一层,根据相邻两个元素的情况生成上一层的元素:如果相邻两个元素相同则生成 ‘A’,不同则生成 ‘B’。
       统计 A 和 B 的数量:遍历整个塔的每一层,统计其中 A 和 B 的数量。
       判断是否满足条件:最后判断统计得到的 A 和 B 的数量是否与目标数量 m 和 n 相等,如果相等则返回 True,表示该底层排列能构建出满足条件的塔,否则返回 False。
  5. 输出统计结果

代码实现

DFS 调用实现

python"># 全局变量用于存储最终结果
result = 0# 深度优先搜索函数,生成底层排列并检查是否满足条件
def dfs(current_layer, target_layer, m, n, current_bottom):global result# 当生成的底层排列达到目标长度时if len(current_bottom) == target_layer:# 调用检查函数判断是否满足条件if check_tower(current_bottom, m, n):result += 1return# 尝试添加 'A' 到当前底层排列dfs(current_layer, target_layer, m, n, current_bottom + ['A'])# 尝试添加 'B' 到当前底层排列dfs(current_layer, target_layer, m, n, current_bottom + ['B'])# 检查基于给定底层排列构建的塔是否满足 A 和 B 的数量要求
def check_tower(bottom, m, n):tower = [bottom]current = bottom# 逐层向上构建塔while len(current) > 1:next_layer = []for i in range(len(current) - 1):if current[i] == current[i + 1]:next_layer.append('A')else:next_layer.append('B')tower.append(next_layer)current = next_layer# 统计塔中 A 和 B 的数量count_a = 0count_b = 0for layer in tower:count_a += layer.count('A')count_b += layer.count('B')# 判断数量是否与目标一致return count_a == m and count_b == n# 主函数,读取输入并启动深度优先搜索
def main():global resultm, n = map(int, input().split())total = m + nlayer = 1# 计算塔的层数while layer * (layer + 1) // 2 != total:layer += 1# 启动深度优先搜索dfs(1, layer, m, n, [])print(result)if __name__ == "__main__":main()

非DFS算法

python"># 检查一个可能的底层排列是否能组成满足规则的塔
def check_bottom(bottom, m, n):tower = [bottom]current = bottom# 逐层构建塔while len(current) > 1:next_layer = []for i in range(len(current) - 1):if current[i] == current[i + 1]:next_layer.append('A')else:next_layer.append('B')tower.append(next_layer)current = next_layer# 统计 A 和 B 的数量count_a = 0count_b = 0for layer in tower:count_a += layer.count('A')count_b += layer.count('B')return count_a == m and count_b == n# 生成所有可能的底层排列
def generate_bottoms(length):from itertools import productreturn product(['A', 'B'], repeat=length)# 主函数
def main():m, n = map(int, input().split())# 计算塔的层数total = m + nlayer = 1while layer * (layer + 1) // 2 != total:layer += 1# 生成所有可能的底层排列bottoms = generate_bottoms(layer)# 检查每个底层排列是否满足条件result = 0for bottom in bottoms:if check_bottom(list(bottom), m, n):result += 1print(result)if __name__ == "__main__":main()

http://www.ppmy.cn/news/1568418.html

相关文章

在线课堂小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

日志收集Day007

1.配置ES集群TLS认证: (1)elk101节点生成证书文件 cd /usr/share/elasticsearch ./bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass "" --days 3650 (2)elk101节点为证书文件修改属主和属组 chown elasticsearch:elasticsearch con…

1.31 实现五个线程的同步

1.使用互斥锁实现 1>程序代码 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include &l…

Sentinel 控制台集成 Nacos 实现规则配置双向同步和持久化存储(提供改造后源码)

目录 一、前言二、Sentinel 控制台规则推送实现原理三、Sentinel控制台源码改造前置准备工作3.1、本文使用各组件版本3.2、下载Sentinel控制台源码3.3、启动Sentinel控制台3.4、应用服务实现 Sentinel 客户端动态获取 Nacos 规则配置3.4.1、添加sentinel集成nacos包 3.4.2、Nac…

.NET Core 中依赖注入的使用

ASP.NET Core中服务注入的地方 在ASP.NET Core项目中一般不需要自己创建ServiceCollection、IServiceProvider。在Program.cs的builder.Build()之前向builder.Services中注入。在Controller中可以通过构造方法注入服务。 低使用频率的服务 把Action用到的服务通过Action的参…

麒麟操作系统服务架构保姆级教程(十四)iptables防火墙四表五链和防火墙应用案例

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 防火墙在运维工作中有着不可或缺的重要性。首先&#xff0c;它是保障网络安全的关键防线&#xff0c;通过设置访问控制规则&#xff0c;可精准过滤非法网络流量&#xff0c;有效阻挡外部黑客攻击、恶…

人格分裂(交互问答)-小白想懂Elasticsearch

通过交互式追问了解一个中间件 ? 啥是Elasticsearch ! 分布式搜索和分析引擎 ? 为啥是分布式搜索&#xff0c;单体难道用不了吗 ? 实际上是说这个东西可以分布式部署 ! 单机可用但扩展性差&#xff0c;分布式通过分片、副本和负载均衡实现海量数据存储与高并发处理 ? 提…

如何利用天赋实现最大化的价值输出

这种文章&#xff0c;以我现在的实力很难写出来。所以需要引用一些视频。 上92高校容易吗 如果基于天赋努力&#xff0c;非常容易。 如果不是这样&#xff0c;非常非常难。 高考失败人生完蛋&#xff1f;复读考上交大&#xff0c;进入社会才发现学历只是一张纸&#xff0c;98…