蓝桥杯刷题023——机器人塔(DFS)
创始人
2024-05-27 16:44:10
0

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

输出描述

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

输入输出样例

输入

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 Falseif clv == 0:          # 层数为0return m == n == 0cb = bin(cur)[2:].count('1')  # 转为二进制:0bxxxx(字符串),统计1的个数count('1')ca = clv - cb        # 不直接统计0的个数,因为例如001010最前面的两个0没办法计入m -= ca; n -= cbup = (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相与(&)就能去掉最左边的一位。注意“-”的优先级大于“>>”,所以需要加一个括号让<<先算。

相关内容

热门资讯

黑与白的初中议论文【经典5篇... 黑与白的初中议论文 篇一黑与白,是一对互补的色彩,代表了对立却又相互依存的存在。在日常生活中,我们常...
初中随笔作文400字【最新5... 初中随笔作文400字 篇一我的偶像每个人都有自己的偶像,他们可以是明星、运动员、作家等等。而我的偶像...
初一餐桌前的谈话作文500字... 初一餐桌前的谈话作文500字 篇一初一餐桌前的谈话今天是我初一的第一天,我很兴奋地回到家中。晚饭时,...
初一作文《假期见闻》(优选6... 初一作文《假期见闻》 篇一我的假期过得非常充实和有意义。在假期中,我参加了一次有趣的亲子旅行,还参加...
八年级作文(精彩6篇) 八年级作文 篇一:我的暑假计划暑假即将来临,我对这个假期充满了期待。我计划度过一个充实而有意义的暑假...
2017年春运火车票购票时间... 2017年春运火车票购票时间表 篇一春运是中国人民一年中最繁忙的出行季节之一,而购票则是春运期间备受...
初中作文题材万能素材积累【优... 初中作文题材万能素材积累 篇一标题:如何保护环境随着工业化和城市化的快速发展,环境问题越来越受到人们...
春天来了初一作文【推荐5篇】 春天来了初一作文 篇一春天来了,大地万物开始苏醒。初一的阳光明媚,温暖的春风轻拂着我们的脸庞,带给我...
老班长作文(优选6篇) 老班长作文 篇一回忆起初中时代,我心中最深刻的一个人就是我们班级的老班长。他是一个身材高大、目光炯炯...
原来我没懂【经典3篇】 原来我没懂 篇一在人生的旅途中,我们常常会因为一些事情或者一些人而感到困惑,迷失方向。不过,当我们经...
初中什么的我600字作文(经... 初中什么的我600字作文 篇一初中生活中的快乐与收获初中生活是人生中一个重要的阶段,对于每个学生来说...
原来这就是爱初一作文(实用6... 原来这就是爱初一作文 篇一我曾经以为爱是一种感觉,是一种浪漫的情怀。然而,随着我渐渐长大,我明白了爱...
孝在我心中初中作文600字(... 孝在我心中初中作文600字 篇一孝在我心中孝,在我心中是一种美德,是一种传统的美德。孝顺父母是我们中...
《怎么快乐》作文【优秀6篇】 《怎么快乐》作文 篇一怎么快乐快乐是一种心态,一种积极向上的情绪状态。每个人对快乐的定义可能不尽相同...
二十年后的我初中作文(实用6... 二十年后的我初中作文 篇一初中时的我,总是充满着梦想和希望。我记得那时的我喜欢画画,梦想成为一名优秀...
夏日情缘初中作文(最新5篇) 夏日情缘初中作文 篇一夏日的阳光炙热,热得令人汗流浃背。然而,在这个炎热的夏季,我经历了一段令人难忘...
不再迷茫初中作文(精彩6篇) 不再迷茫初中作文 篇一初中生活是人生中一个重要的阶段,对于很多同学来说,初中生活充满了挑战和困惑。然...
初中毕业作文(推荐6篇) 初中毕业作文 篇一我的初中生活初中生活即将结束,回首这三年的时光,我不禁感慨万分。这段时间,我经历了...
初中新生活【优选6篇】 初中新生活 篇一初中新生活带给我许多新鲜感受和挑战。从进入初中的第一天起,我就感受到了与小学完全不同...
我的初一生活作文800字(优... 我的初一生活作文800字 篇一初一生活,是我人生中的一段重要时光。刚升入初中的我,面对新环境和新生活...