【蓝桥杯】43697.机器人塔

news/2025/2/1 6:23:02 标签: 蓝桥杯, python, 程序算法

题目描述

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 += 1
        return
    # 尝试添加 '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 = 0
    count_b = 0
    for layer in tower:
        count_a += layer.count('A')
        count_b += layer.count('B')
    # 判断数量是否与目标一致
    return count_a == m and count_b == n

# 主函数,读取输入并启动深度优先搜索
def main():
    global result
    m, n = map(int, input().split())
    total = m + n
    layer = 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 = 0
    count_b = 0
    for 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 product
    return product(['A', 'B'], repeat=length)

# 主函数
def main():
    m, n = map(int, input().split())
    # 计算塔的层数
    total = m + n
    layer = 1
    while layer * (layer + 1) // 2 != total:
        layer += 1
    # 生成所有可能的底层排列
    bottoms = generate_bottoms(layer)
    # 检查每个底层排列是否满足条件
    result = 0
    for bottom in bottoms:
        if check_bottom(list(bottom), m, n):
            result += 1
    print(result)

if __name__ == "__main__":
    main()

http://www.niftyadmin.cn/n/5839062.html

相关文章

1 HDFS

1 HDFS 1. HDFS概述2. HDFS架构3. HDFS的特性4. HDFS 的命令行使用5. hdfs的高级使用命令6. HDFS 的 block 块和副本机制6.1 抽象为block块的好处6.2 块缓存6.3 hdfs的文件权限验证6.4 hdfs的副本因子 7. HDFS 文件写入过程&#xff08;非常重要&#xff09;7.1 网络拓扑概念7.…

如何获取Springboot项目运行路径 (idea 启动以及打包为jar均可) 针对无服务器容器新建上传文件路径(适用于win 与 linunix)

public class Constants {public static String getUploadDir() {// 获取 JAR 包所在目录ApplicationHome home new ApplicationHome(Constants.class);File jarDir home.getDir();// 构建上传文件存储路径&#xff08;JAR 同级目录下的 uploads 文件夹&#xff09;File uplo…

漏洞扫描工具之xray

下载地址&#xff1a;https://github.com/chaitin/xray/releases 1.9.11 使用文档&#xff1a;https://docs.xray.cool/tools/xray/Scanning 与burpsuite联动&#xff1a; https://xz.aliyun.com/news/7563 参考&#xff1a;https://blog.csdn.net/lza20001103/article/details…

sublime_text的快捷键

sublime_text的快捷键 向下复制, 复制光标所在整行并插入到下一行&#xff1a;通过 CtrlShiftD 实现快速复制当前行的功能。 可选多行, 不选则复制当前行 ctrl Shift D 删除当前行&#xff1a;通过 CtrlShiftK 实现快速删除当前行的功能。 可选多行, 不选则删当前行 ctrl S…

《DeepSeek API:开启人工智能新时代的密钥》

探秘 DeepSeek API 在人工智能的浩瀚宇宙中&#xff0c;DeepSeek API 宛如一颗璀璨的新星&#xff0c;正逐渐崭露头角&#xff0c;吸引着全球开发者与企业的目光。随着人工智能技术的飞速发展&#xff0c;API&#xff08;应用程序编程接口&#xff09;作为连接不同软件系统和服…

Java开发vscode环境搭建

1 几个名词 JDK Java Development Kit JRE Java Runtion Environment JVM JDK 包括 Compiler,debugger,JRE等。JRE包括JVM和Runtime Library。 2 配置环境 2.1 安装JDK 类比 C/C的 g工具 官网&#xff1a;https://www.oracle.com/java/technologies/downloads/ 根据自己使…

CSS 背景与边框:从基础到高级应用

CSS 背景与边框&#xff1a;从基础到高级应用 1. CSS 背景样式1.1 背景颜色示例代码&#xff1a;设置背景颜色 1.2 背景图像示例代码&#xff1a;设置背景图像 1.3 控制背景平铺行为示例代码&#xff1a;控制背景平铺 1.4 调整背景图像大小示例代码&#xff1a;调整背景图像大小…

分层多维度应急管理系统的设计

一、系统总体架构设计 1. 六层体系架构 #mermaid-svg-QOXtM1MnbrwUopPb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QOXtM1MnbrwUopPb .error-icon{fill:#552222;}#mermaid-svg-QOXtM1MnbrwUopPb .error-text{f…