题目描述
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
解法一
解题思路
通过等差数列公式可得最后一行元素个数row = math.sqrt(2*(m+n))
通过确定最后一行A,B的分布情况可以确定整个机器人塔的元素分布
我们只需找出最后一行排列的全部可能中能形成整个机器人塔的可能总数即可
python代码
#机器人塔
import math
def check():# 判断是否可以向上拓展
a = 0
b = 0
tmp = row
while tmp >0:
for i in range(1, tmp+1):
if cnt[i] == 1:
a +=1
else:
b += 1
for i in range(2, tmp+1):
if cnt[i-1]==cnt[i]:
cnt[i-1] = 1
else:
cnt[i-1] = 2
tmp -=1
if a == m and b == n:
return True
else:
return False
def dfs(k):# 遍历所有第一排
global res
if k > row:
if check():
res +=1
return
cnt[k] = 1
dfs(k+1)
cnt[k] = 2
dfs(k+1)
if __name__ == "__main__":
m = int(input())
n = int(input())
res = 0
row = int(math.sqrt(2*(m+n)))
cnt = [0 for _ in range(row+1)]
dfs(1)
print(res)
运行结果