# -*- 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 位移後的字符串進行計數