0
点赞
收藏
分享

微信扫一扫

【思特奇杯·云上蓝桥-算法训练营】第1周:机器人塔

题目

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

再例如:
用户输入:
3 3

程序应该输出:
4

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms

Code

# -*- coding:UTF-8 -*-
"""
@Project :蓝桥杯训练营
@File    :机器人塔.py
@IDE     :PyCharm
@Author  :Kinght_123
@Date    :2022/1/6 10:27
"""


def dfs(x, s, aa, bb):
    global ans
    if aa < 0 or bb < 0:
        return
    if aa == 0 or bb == 0:
        ans += 1
        return
    cs = bs = 0
    p = 'A'
    cs += 1
    for i in range(len(s)):
        if s[i] == 'A':
            if p[i] == 'A':
                p += 'A'
                cs += 1
            else:
                p += 'B'
                bs += 1
        else:
            if p[i] == 'A':
                p += 'B'
                bs += 1
            else:
                p += 'A'
                cs += 1
    dfs(x + 1, p, aa - cs, bb - bs)
    cs = bs = 0
    q = 'B'
    bs += 1
    for i in range(len(s)):
        if s[i] == 'A':
            if q[i] == 'A':
                q += 'A'
                cs += 1
            else:
                q += 'B'
                bs += 1
        else:
            if q[i] == 'A':
                q += 'B'
                bs += 1
            else:
                q += 'A'
                cs += 1
    dfs(x + 1, q, aa - cs, bb - bs)


if __name__ == "__main__":
    a = int(input())
    b = int(input())
    ans = 0
    c = []
    c += 'A'
    dfs(1, c, a - 1, b)
    c[0] = 'B'
    dfs(1, c, a, b - 1)
    print(ans)


运行结果

举报

相关推荐

0 条评论