您的位置:首页 > 编程语言 > Python开发

用python编写程序游戏——号码球

2010-06-04 20:41 459 查看
题目:

现有十个分别标有1-10号码的球,十个分别标有1-10号码的罐子。每个球放进一个罐子里,现要求每一个球都不能放在同一号码的罐子中,请问有多少种放法?

思路:

先求出全排列,然后从全排列中剔除不符合要求的列表

程序:

def BaseFullArray(li):
if type(li)!=list:
return
if len(li)==1:
return [li]
result=[]
for i in range(0,len(li)):
temp=li[:]
head=temp.pop(i)
for j in BaseFullArray(temp):
j.insert(0,head)
result.append(j)
return result

def FullArray(n):  #全排序
if type(n)!=int or n<1:
return
return BaseFullArray(list(range(1,n+1)))
def Search(fli,n):  #fli为全排序,如[[1,2],[2,1]],n为瓶子个数,如之前的fli就为2
result=[fli[i] for i in range(0,len(fli))
if True not in
[fli[i][j]==(j+1) for j in range(0,n)]
]
return result
if __name__=="__main__":
print Search(FullArray(6),6)      #输出符合的列表
print len(Search(FullArray(6),6)) #输出符合的列表的个数


暴力方法,仅供参考

这种方法不高效,以下是另外两种方法

排序组合法:

def P(x,y=None):
if x==0 or y==0:
return 1
result=x
i=x-1
if y==None:
l=1
else:
l=y
while i>l:
result*=i
i-=1
return result
def C(x,y):
if x==y:
return 1
else:
return P(x,y)/P(x-y)

def CodeBall(n):
if n==0 or n==2:
return 1
elif n==1:
return 0
else:
result=P(n)-1
for i in range(2,n):
result-=C(n,n-i)*CodeBall(i)
return result
if __name__=="__main__":
print CodeBall(6)


递归法:

def F(n):
if n==1: return 0
if n==2: return 1

Fn,Fn_1=1,0
for i in xrange(2,n):
Fn,Fn_1=i*(Fn+Fn_1),Fn
else:
return Fn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: