原题链接:蓝桥杯2015年第六届真题-机器人塔
解题思路:
观察A和B的规律:A只能由两个相同字母得到,B只能由两个不同字母得到->等价于异或中的运算规则
1^0=1,0^1=1,0^0=1,1^1=0.即A=0,B=1
再看摆放条件,是下层决定上层,所以先摆放最底层的A和B,再决定上层如何摆放,重复这个过程直至所有的A和B被摆放完,最后看是否所有层都摆满,若摆满了说明最底层的摆放可行,计数+1
注意事项:
参考代码:
import itertools, collections m, n = map(int, input().strip().split()) sum_up = m + n level = 0 while sum_up: # 求出层数,构成三角形的总数刚好是等差数列的和 level += 1 sum_up -= level count = 0 for i in itertools.product(range(2), repeat = level):#利用product生成最底层01(AB)的全排列 temp_i = list(i) temp = collections.Counter(temp_i)#统计所需的0和1的个数 temp_m = m - temp[0] # 剩余A的个数 temp_n = n - temp[1] # 剩余B的个数 temp_level = level - 1 # 从第二层开始(第一层摆好了) while (temp_m > 0 or temp_n > 0) and temp_level > 0: temp_j = [] j = 0 while j < temp_level: cur = temp_i[j] ^ temp_i[j + 1] temp_j.append(cur) if int(cur) == 0: temp_m -= 1 else: temp_n -= 1 j += 1 temp_i = temp_j #更新底层的排列 temp_level -= 1 if temp_level == 0 and temp_m == 0 and temp_n == 0: count += 1 print(count)
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复