【蓝桥杯】机器人塔

题目

题目描述

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,NM,N(0

输出描述

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

输入输出样例

输入

1 2

输出 

3

题解

这道题容易思维定式从底层开始建,其实从顶上开始建方便很多,因为没有初始条件需要初始化。采用深度优先搜索,a、b是A、B的剩余数量,s是前一层的AB字符串,r是当前结果。每次迭代,分别尝试A、B开头,一旦第一个决定,后续都被s唯一确定,存入nx中。因为数量是刚好的,所以只要在迭代开头判断a、b都用完就是成功方案。


def main():
    res=0
    a,b=map(int,input().split())
    def dfs(a,b,s,r):
        if a==0 and b==0:
            return r+1
        if a<0 or b<0:
            return r
        
        for first in 'AB':
            nx=first
            if nx=='A':
                na=a-1
                nb=b
            else:
                nb=b-1
                na=a
            for i in s:
                if i=='A':
                    if nx[-1]=='A':
                        nx+='A';na-=1
                    else:
                        nx+='B';nb-=1
                else:
                    if nx[-1]=='A':
                        nx+='B';nb-=1
                    else:
                        nx+='A';na-=1
            r=dfs(na,nb,nx,r)
        return r
    res=dfs(a,b,'',res)
    print(res)
if __name__=='__main__':
    main()

 唯一需要注意的就是用新的变量储存修改后的a、b数量,送入下一次迭代,不要直接修改a、b,因为在同一层迭代中,尝试不同A、B组合时需要相同的初始条件,不改变初始值其实就实现了回溯。

你可能感兴趣的:(蓝桥杯,算法,数据结构)