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

来源:互联网 发布:seo公司usseo 编辑:程序博客网 时间:2024/06/11 19:24

# -*- coding: utf-8 -*-"""Created on Mon Feb 17 13:37:22 2014@author: zhu"""#将1到10填入正五边形的顶点和边,使得每条边三数之和相等,求总数import itertoolsl=[i for i in range(1,11)]ls=list(itertools.permutations(l))#全排列results=[]k=0N=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 strdef 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]]=1for k in d.keys(): #print     print k

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

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

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

            3  位移后的字符串进行计数 


0 0