用python编写程序游戏——号码球
2010-06-04 20:41
459 查看
题目:
现有十个分别标有1-10号码的球,十个分别标有1-10号码的罐子。每个球放进一个罐子里,现要求每一个球都不能放在同一号码的罐子中,请问有多少种放法?
思路:
先求出全排列,然后从全排列中剔除不符合要求的列表
程序:
暴力方法,仅供参考
这种方法不高效,以下是另外两种方法
排序组合法:
递归法:
现有十个分别标有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
相关文章推荐
- 树莓派学习系列5——使用python编写简单的游戏程序
- 使用Python编写程序求解数独游戏答案
- 编写高质量代码--改善python程序的建议(四)
- python程序编写简介
- python学习之编写查询ip程序
- 如何在Python中编写并发程序
- Python程序,辅助微信跳一跳游戏介绍
- Windows 上面搭建 Spark + Pycharm/idea scala/python 本地编写Spark程序,测试通过后再提交到Linux集群上
- iOS游戏框架Sprite Kit基础教程第1章编写第一个Sprite Kit程序
- Python编写屏幕截图程序方法
- 用Python编写分析Python程序性能的工具的教程
- python GUI编程——wxpython编写简单记事本程序
- 用Python编写一个简单的俄罗斯方块游戏的教程
- 使用Python+tkinter编写电脑桌面放大镜程序
- Python编写判断成绩的程序
- python编写简单程序访问A8系统
- Python编写同步游戏目录(转载)
- 使用Python Tkinter编写的简易发送邮件程序
- 编写高质量代码--改善python程序的建议(三)
- 在 Vim 中编写 Python 程序