一個小學奧數題的python實現(全排列,字符串循環移位,統計元素)

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章