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

一个小学奥数题的python实现(全排列,字符串循环移位,统计元素)

2014-02-17 15:57 441 查看
# -*- coding: utf-8 -*-
"""
Created on Mon Feb 17 13:37:22 2014

@author: zhu
"""
#将1到10填入正五边形的顶点和边,使得每条边三数之和相等,求总数

import itertools
l=[i for i in range(1,11)]
ls=list(itertools.permutations(l))#全排列
results=[]
k=0
N=len(ls)
rerange=[]
for i in range(N):
l1=ls[i][0]+ls[i][1]+ls[i][2]
l2=ls[i][2]+ls[i][3]+ls[i][4]
l3=ls[i][4]+ls[i][5]+ls[i][6]
l4=ls[i][6]+ls[i][7]+ls[i][8]
l5=ls[i][8]+ls[i][9]+ls[i][0]
if l1==l2 and l2==l3 and l3==l4 and l4==l5 and l5==l1:
s=[str(ls[i][x]) for x in range(len(ls[i]))]    #将符合条件的元组每一个元素(int型)转换成字符
results.append(''.join(s)) #tulpe to str
def str_trans(mystr,ind): # str_loop ,ind means find the position in str
new_str=("%s%s"%(mystr[ind:],mystr[0:ind])) # exchange str at ind
return new_str

for i in range(len(results)):  #对每一个元素都进行判断从10开始,方便找出重复
ind=results[i].find('10')
nstr=str_trans(results[i],ind)
rerange.append(nstr)

d={}
for x in range(len(rerange)): # count
if rerange[x] in d:
d[rerange[x]]+=1
else:
d[rerange[x]]=1

for k in d.keys(): #print
print k


原题是:将1到10填入正五边形的顶点和边,使得每条边三数之和相等,求总的个数

思路:1 首先用暴力破解生成1~10的全排列list,对list进行判断,满足条件的存入新的list

2 新list里面可能存在重复的解(因为是首尾相继的,无法判断从哪里开始),选定一个开始的数,将环状字符串切开,对字符串整体进行循环位移,用来判断是否重复

3 位移后的字符串进行计数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐