E:/GitHub/suanfaquti/Q09落单的男女1.py
'''
问题描述(有少量修改)
3男(1)3女(0)组成一队,如果从任何地方切成两队,这两队的男女人数都不等,
则称为不均等队。如110100是不均等队,110001是均等队(切成1100和01即可)。
不考虑人的不同,即1101和1101是一队,不考虑(m1m2w1m3)这样的情况。
现在有20男10女,求可以组成的不均等队的数量。
分析
20男10女组成21*11的二维棋盘(0->20,0->10),起点(0,0)表示当前0男0女,
终点(20,10)表示20男10女,只能往右/上走,不能走出棋盘,
不能走到res上(res是坐标的集合,走到里面的点意味着是均等队),
那么走到(20,10)就必须先走到(19,10)或者(20,9),可使用递归
'''
m,w=20,10
k=min(m,w) #棋盘宽度
res=set()
for i in range(1,k+1):
res.add((i,i))
res.add((m-i,w-i))
if (0,0) in res:
res.remove((0,0))
if (m,w) in res:
res.remove((m,w))
print(res)
def f(x,y):
if (x,y)==(0,0):
return 1
if x<0 or y<0 or (x,y) in res:
return 0
return f(x-1,y)+f(x,y-1)
print(f(m,w)) #2417416
'''
问题描述(有少量修改)
3男(1)3女(0)组成一队,如果从任何地方切成两队,这两队的男女人数都不等,
则称为不均等队。如110100是不均等队,110001是均等队(切成1100和01即可)。
不考虑人的不同,即1101和1101是一队,不考虑(m1m2w1m3)这样的情况。
现在有20男10女,求可以组成的不均等队的数量。
分析
20男10女组成21*11的二维棋盘(0->20,0->10),起点(0,0)表示当前0男0女,
终点(20,10)表示20男10女,只能往右/上走,不能走出棋盘,
不能走到res上(res是坐标的集合,走到里面的点意味着是均等队),
那么走到(20,10)就必须先走到(19,10)或者(20,9),可使用递归
'''
m,w=20,10
k=min(m,w) #棋盘宽度
res=set()
for i in range(1,k+1):
res.add((i,i))
res.add((m-i,w-i))
if (0,0) in res:
res.remove((0,0))
if (m,w) in res:
res.remove((m,w))
print(res)
def f(x,y):
if (x,y)==(0,0):
return 1
if x<0 or y<0 or (x,y) in res:
return 0
return f(x-1,y)+f(x,y-1)
print(f(m,w)) #2417416