机器人塔(DFS)
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
再例如:
用户输入:
3 3
程序应该输出:
4
思路:
我们输入的A,B的值先确定塔的层数,因为题目说了保证人数的合理性,无论A,B给多少人,能堆出来的塔的层数一定是唯一确定的。我们先从最后一层开始把最后一层的所有可能遍历出来,然后在用递推的方式一层一层的递归。c[r+1][l]==c[r+1][l+1]这个是当下面的字母相等时当前的这个位置一定为a,反之就是b。
程序:
a=list(map(int,input().split()))
s=sum(a)
ab=[1,2]
for i in range(2,1000):
if s==((i+1)*i)//2:
o=i
break
try:
c=[[0 for i1 in range(o+1)]for i in range(o+1)]
con=0
def ck(i,r,l):
if a[i]-1>=0:
c[r][l]=ab[i]
a[i]-=1
if l>=r:
dfs(r-1,0)
else:
dfs(r,l+1)
c[r][l]=0
a[i]+=1
def dfs(r,l):
global con
if r==-1:
con+=1
return
elif r==o-1:
for i in range(2):
ck(i,r,l)
elif c[r+1][l]==c[r+1][l+1]:
ck(0,r,l)
elif c[r+1][l]!=c[r+1][l+1]:
ck(1,r,l)
dfs(o-1,0)
print(con)
except:
print(0)
禁止转载。仅用于自己学习。对程序错误不负责。