# -*- 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 位移后的字符串进行计数