1.Python算法之枚举算法
1.什么是枚舉算法?
? ? ?枚舉算法也叫窮舉算法,最大特點是在面對任何情況時會嘗試每一種解決方法。在進行歸納推力時,如果逐個考察了某類事件的所有可能情況,因而得出一般結論,那么這個結論是可靠的,這種歸納方法叫做枚舉法
2.枚舉算法的基礎
? ?枚舉算法的思想是:將問題的所有可能的答案一一列舉,然后根據條件判斷答案是否合適,保留合適的,丟棄不合適的。
? ? python中一般用while循環或if語句實現。
? ? 使用枚舉算法的基本思路:
? ? ? ? ? (1)確定枚舉對象、枚舉范圍和判定條件。
? ? ? ? ? (2)?逐一列舉可能的解,驗證每個解是否是問題的解
? ?一般情況下,按照下面三個步驟進行:
? ? ? (1)解的可能范圍,不能遺漏任何一個真正解,也要避免有重復。
? ? ? (2)判斷是否是真正解的方法
? ? ? ?(3)使可能解的范圍降至最小,以便提高解決問題的效率
3.枚舉算法計算24點游戲
? ? ? 24點是一款經典的棋牌類益智游戲,要求四個數字的運算結果等于二十四。?即?用加、減、乘、除把牌面上的數算成24.
? ? 每張牌必須且只能用一次,?例如:? 抽出的牌為3、8、8、9,那么? ?(9-8)×8×3=24
# 枚舉算法# 24點游戲 import itertools# 計算24點游戲代碼 def twentyfour(cards):"""(1)itertools.permutations(可迭代對象):通俗地講,就是返回可迭代對象的所有數學全排列方式。itertools.permutations("1118") -> 即將數字1118進行全排列組合(2)itertools.product(*iterables, repeat=1)iterables是可迭代對象,repeat指定iterable重復幾次返回一個或者多個iterables中的元素的笛卡爾積的元組即為product(list1, list2) 依次取出list1中的每1個元素,與list2中的每1個元素,組成元組,repeat即為元組中有幾個元素,最多重復幾次(3)"""for num in itertools.permutations(cards):for ops in itertools.product("+-*/", repeat=3):# ({0}{4}{1}){5}({2}{6}{3}) - > 即在{0}{1}{2}{3}放上數字,{4}{5}{6}放上運算符號,只能放三個,四個數字中間只能放三個運算符# 帶括號有8種方法# 1. (ab)cdbsd1 = '({0}{4}{1}){5}{2}{6}{3}'.format(*num, *ops)# 2. a(bc)dbsd2 = '{0}{4}({1}{5}{2}){6}{3}'.format(*num, *ops)# 3. ab(cd)bsd3 = '{0}{4}{1}{5}({2}{6}{3})'.format(*num, *ops)# 4. (ab)(cd)bsd4 = '({0}{4}{1}){5}({2}{6}{3})'.format(*num, *ops)# 5. ((ab)c)dbsd5 = '(({0}{4}{1}){5}{2}){6}{3}'.format(*num, *ops)# 6. (a(bc))dbsd6 = '({0}{4}({1}{5}{2})){6}{3}'.format(*num, *ops)# 7. a((bc)d)bsd7 = '{0}{4}(({1}{5}{2}){6}{3})'.format(*num, *ops)# 8. a(b(cd))bsd8 = '{0}{4}({1}{5}({2}{6}{3}))'.format(*num, *ops)# print([bsd1, bsd2, bsd3, bsd4, bsd5, bsd6, bsd7, bsd8])for bds in [bsd1, bsd2, bsd3, bsd4, bsd5, bsd6, bsd7, bsd8]:try:if abs(eval(bds) - 24.0) < 1e-20:return "24點結果 = "+bdsexcept ZeroDivisionError: # 零除錯誤continuereturn "Not fond"cards = ['2484', '1126', '1127', '1128', '2484', '1111'] for card in cards:print(twentyfour(card))運行結果:? ? ?cards中的牌數,最終通過加減乘除得出24,而1111這四個數不能通過加減乘除得到24,返回值
我們可以通過到4個數字組成的8種帶括號形式,可以看出,4個中的每個數字以及每個符號,可能的各種組合都試試,直到找到四個數字通過加減乘除給哪一塊帶括號,算出結果24.?這就是枚舉算法思想
? ?用24點游戲中很難算的4156這四個數字舉出下面例子看其過程:? 因為很難算,所以試的過程也就更多
""" ['(4+1)+5+6', '4+(1+5)+6', '4+1+(5+6)', '(4+1)+(5+6)', '((4+1)+5)+6', '(4+(1+5))+6', '4+((1+5)+6)', '4+(1+(5+6))'] ['(4+1)+5-6', '4+(1+5)-6', '4+1+(5-6)', '(4+1)+(5-6)', '((4+1)+5)-6', '(4+(1+5))-6', '4+((1+5)-6)', '4+(1+(5-6))'] ['(4+1)+5*6', '4+(1+5)*6', '4+1+(5*6)', '(4+1)+(5*6)', '((4+1)+5)*6', '(4+(1+5))*6', '4+((1+5)*6)', '4+(1+(5*6))'] ['(4+1)+5/6', '4+(1+5)/6', '4+1+(5/6)', '(4+1)+(5/6)', '((4+1)+5)/6', '(4+(1+5))/6', '4+((1+5)/6)', '4+(1+(5/6))'] ['(4+1)-5+6', '4+(1-5)+6', '4+1-(5+6)', '(4+1)-(5+6)', '((4+1)-5)+6', '(4+(1-5))+6', '4+((1-5)+6)', '4+(1-(5+6))'] ['(4+1)-5-6', '4+(1-5)-6', '4+1-(5-6)', '(4+1)-(5-6)', '((4+1)-5)-6', '(4+(1-5))-6', '4+((1-5)-6)', '4+(1-(5-6))'] ['(4+1)-5*6', '4+(1-5)*6', '4+1-(5*6)', '(4+1)-(5*6)', '((4+1)-5)*6', '(4+(1-5))*6', '4+((1-5)*6)', '4+(1-(5*6))'] ['(4+1)-5/6', '4+(1-5)/6', '4+1-(5/6)', '(4+1)-(5/6)', '((4+1)-5)/6', '(4+(1-5))/6', '4+((1-5)/6)', '4+(1-(5/6))'] ['(4+1)*5+6', '4+(1*5)+6', '4+1*(5+6)', '(4+1)*(5+6)', '((4+1)*5)+6', '(4+(1*5))+6', '4+((1*5)+6)', '4+(1*(5+6))'] ['(4+1)*5-6', '4+(1*5)-6', '4+1*(5-6)', '(4+1)*(5-6)', '((4+1)*5)-6', '(4+(1*5))-6', '4+((1*5)-6)', '4+(1*(5-6))'] ['(4+1)*5*6', '4+(1*5)*6', '4+1*(5*6)', '(4+1)*(5*6)', '((4+1)*5)*6', '(4+(1*5))*6', '4+((1*5)*6)', '4+(1*(5*6))'] ['(4+1)*5/6', '4+(1*5)/6', '4+1*(5/6)', '(4+1)*(5/6)', '((4+1)*5)/6', '(4+(1*5))/6', '4+((1*5)/6)', '4+(1*(5/6))'] ['(4+1)/5+6', '4+(1/5)+6', '4+1/(5+6)', '(4+1)/(5+6)', '((4+1)/5)+6', '(4+(1/5))+6', '4+((1/5)+6)', '4+(1/(5+6))'] ['(4+1)/5-6', '4+(1/5)-6', '4+1/(5-6)', '(4+1)/(5-6)', '((4+1)/5)-6', '(4+(1/5))-6', '4+((1/5)-6)', '4+(1/(5-6))'] ['(4+1)/5*6', '4+(1/5)*6', '4+1/(5*6)', '(4+1)/(5*6)', '((4+1)/5)*6', '(4+(1/5))*6', '4+((1/5)*6)', '4+(1/(5*6))'] ['(4+1)/5/6', '4+(1/5)/6', '4+1/(5/6)', '(4+1)/(5/6)', '((4+1)/5)/6', '(4+(1/5))/6', '4+((1/5)/6)', '4+(1/(5/6))'] ['(4-1)+5+6', '4-(1+5)+6', '4-1+(5+6)', '(4-1)+(5+6)', '((4-1)+5)+6', '(4-(1+5))+6', '4-((1+5)+6)', '4-(1+(5+6))'] ['(4-1)+5-6', '4-(1+5)-6', '4-1+(5-6)', '(4-1)+(5-6)', '((4-1)+5)-6', '(4-(1+5))-6', '4-((1+5)-6)', '4-(1+(5-6))'] ['(4-1)+5*6', '4-(1+5)*6', '4-1+(5*6)', '(4-1)+(5*6)', '((4-1)+5)*6', '(4-(1+5))*6', '4-((1+5)*6)', '4-(1+(5*6))'] ['(4-1)+5/6', '4-(1+5)/6', '4-1+(5/6)', '(4-1)+(5/6)', '((4-1)+5)/6', '(4-(1+5))/6', '4-((1+5)/6)', '4-(1+(5/6))'] ['(4-1)-5+6', '4-(1-5)+6', '4-1-(5+6)', '(4-1)-(5+6)', '((4-1)-5)+6', '(4-(1-5))+6', '4-((1-5)+6)', '4-(1-(5+6))'] ['(4-1)-5-6', '4-(1-5)-6', '4-1-(5-6)', '(4-1)-(5-6)', '((4-1)-5)-6', '(4-(1-5))-6', '4-((1-5)-6)', '4-(1-(5-6))'] ['(4-1)-5*6', '4-(1-5)*6', '4-1-(5*6)', '(4-1)-(5*6)', '((4-1)-5)*6', '(4-(1-5))*6', '4-((1-5)*6)', '4-(1-(5*6))'] ['(4-1)-5/6', '4-(1-5)/6', '4-1-(5/6)', '(4-1)-(5/6)', '((4-1)-5)/6', '(4-(1-5))/6', '4-((1-5)/6)', '4-(1-(5/6))'] ['(4-1)*5+6', '4-(1*5)+6', '4-1*(5+6)', '(4-1)*(5+6)', '((4-1)*5)+6', '(4-(1*5))+6', '4-((1*5)+6)', '4-(1*(5+6))'] ['(4-1)*5-6', '4-(1*5)-6', '4-1*(5-6)', '(4-1)*(5-6)', '((4-1)*5)-6', '(4-(1*5))-6', '4-((1*5)-6)', '4-(1*(5-6))'] ['(4-1)*5*6', '4-(1*5)*6', '4-1*(5*6)', '(4-1)*(5*6)', '((4-1)*5)*6', '(4-(1*5))*6', '4-((1*5)*6)', '4-(1*(5*6))'] ['(4-1)*5/6', '4-(1*5)/6', '4-1*(5/6)', '(4-1)*(5/6)', '((4-1)*5)/6', '(4-(1*5))/6', '4-((1*5)/6)', '4-(1*(5/6))'] ['(4-1)/5+6', '4-(1/5)+6', '4-1/(5+6)', '(4-1)/(5+6)', '((4-1)/5)+6', '(4-(1/5))+6', '4-((1/5)+6)', '4-(1/(5+6))'] ['(4-1)/5-6', '4-(1/5)-6', '4-1/(5-6)', '(4-1)/(5-6)', '((4-1)/5)-6', '(4-(1/5))-6', '4-((1/5)-6)', '4-(1/(5-6))'] ['(4-1)/5*6', '4-(1/5)*6', '4-1/(5*6)', '(4-1)/(5*6)', '((4-1)/5)*6', '(4-(1/5))*6', '4-((1/5)*6)', '4-(1/(5*6))'] ['(4-1)/5/6', '4-(1/5)/6', '4-1/(5/6)', '(4-1)/(5/6)', '((4-1)/5)/6', '(4-(1/5))/6', '4-((1/5)/6)', '4-(1/(5/6))'] ['(4*1)+5+6', '4*(1+5)+6', '4*1+(5+6)', '(4*1)+(5+6)', '((4*1)+5)+6', '(4*(1+5))+6', '4*((1+5)+6)', '4*(1+(5+6))'] ['(4*1)+5-6', '4*(1+5)-6', '4*1+(5-6)', '(4*1)+(5-6)', '((4*1)+5)-6', '(4*(1+5))-6', '4*((1+5)-6)', '4*(1+(5-6))'] ' ' '中間的結果太長太長所以省略一部分 ' ' ' ['(6-5)-4*1', '6-(5-4)*1', '6-5-(4*1)', '(6-5)-(4*1)', '((6-5)-4)*1', '(6-(5-4))*1', '6-((5-4)*1)', '6-(5-(4*1))'] ['(6-5)-4/1', '6-(5-4)/1', '6-5-(4/1)', '(6-5)-(4/1)', '((6-5)-4)/1', '(6-(5-4))/1', '6-((5-4)/1)', '6-(5-(4/1))'] ['(6-5)*4+1', '6-(5*4)+1', '6-5*(4+1)', '(6-5)*(4+1)', '((6-5)*4)+1', '(6-(5*4))+1', '6-((5*4)+1)', '6-(5*(4+1))'] ['(6-5)*4-1', '6-(5*4)-1', '6-5*(4-1)', '(6-5)*(4-1)', '((6-5)*4)-1', '(6-(5*4))-1', '6-((5*4)-1)', '6-(5*(4-1))'] ['(6-5)*4*1', '6-(5*4)*1', '6-5*(4*1)', '(6-5)*(4*1)', '((6-5)*4)*1', '(6-(5*4))*1', '6-((5*4)*1)', '6-(5*(4*1))'] ['(6-5)*4/1', '6-(5*4)/1', '6-5*(4/1)', '(6-5)*(4/1)', '((6-5)*4)/1', '(6-(5*4))/1', '6-((5*4)/1)', '6-(5*(4/1))'] ['(6-5)/4+1', '6-(5/4)+1', '6-5/(4+1)', '(6-5)/(4+1)', '((6-5)/4)+1', '(6-(5/4))+1', '6-((5/4)+1)', '6-(5/(4+1))'] ['(6-5)/4-1', '6-(5/4)-1', '6-5/(4-1)', '(6-5)/(4-1)', '((6-5)/4)-1', '(6-(5/4))-1', '6-((5/4)-1)', '6-(5/(4-1))'] ['(6-5)/4*1', '6-(5/4)*1', '6-5/(4*1)', '(6-5)/(4*1)', '((6-5)/4)*1', '(6-(5/4))*1', '6-((5/4)*1)', '6-(5/(4*1))'] ['(6-5)/4/1', '6-(5/4)/1', '6-5/(4/1)', '(6-5)/(4/1)', '((6-5)/4)/1', '(6-(5/4))/1', '6-((5/4)/1)', '6-(5/(4/1))'] ['(6*5)+4+1', '6*(5+4)+1', '6*5+(4+1)', '(6*5)+(4+1)', '((6*5)+4)+1', '(6*(5+4))+1', '6*((5+4)+1)', '6*(5+(4+1))'] ['(6*5)+4-1', '6*(5+4)-1', '6*5+(4-1)', '(6*5)+(4-1)', '((6*5)+4)-1', '(6*(5+4))-1', '6*((5+4)-1)', '6*(5+(4-1))'] ['(6*5)+4*1', '6*(5+4)*1', '6*5+(4*1)', '(6*5)+(4*1)', '((6*5)+4)*1', '(6*(5+4))*1', '6*((5+4)*1)', '6*(5+(4*1))'] ['(6*5)+4/1', '6*(5+4)/1', '6*5+(4/1)', '(6*5)+(4/1)', '((6*5)+4)/1', '(6*(5+4))/1', '6*((5+4)/1)', '6*(5+(4/1))'] ['(6*5)-4+1', '6*(5-4)+1', '6*5-(4+1)', '(6*5)-(4+1)', '((6*5)-4)+1', '(6*(5-4))+1', '6*((5-4)+1)', '6*(5-(4+1))'] ['(6*5)-4-1', '6*(5-4)-1', '6*5-(4-1)', '(6*5)-(4-1)', '((6*5)-4)-1', '(6*(5-4))-1', '6*((5-4)-1)', '6*(5-(4-1))'] ['(6*5)-4*1', '6*(5-4)*1', '6*5-(4*1)', '(6*5)-(4*1)', '((6*5)-4)*1', '(6*(5-4))*1', '6*((5-4)*1)', '6*(5-(4*1))'] ['(6*5)-4/1', '6*(5-4)/1', '6*5-(4/1)', '(6*5)-(4/1)', '((6*5)-4)/1', '(6*(5-4))/1', '6*((5-4)/1)', '6*(5-(4/1))'] ['(6*5)*4+1', '6*(5*4)+1', '6*5*(4+1)', '(6*5)*(4+1)', '((6*5)*4)+1', '(6*(5*4))+1', '6*((5*4)+1)', '6*(5*(4+1))'] ['(6*5)*4-1', '6*(5*4)-1', '6*5*(4-1)', '(6*5)*(4-1)', '((6*5)*4)-1', '(6*(5*4))-1', '6*((5*4)-1)', '6*(5*(4-1))'] ['(6*5)*4*1', '6*(5*4)*1', '6*5*(4*1)', '(6*5)*(4*1)', '((6*5)*4)*1', '(6*(5*4))*1', '6*((5*4)*1)', '6*(5*(4*1))'] ['(6*5)*4/1', '6*(5*4)/1', '6*5*(4/1)', '(6*5)*(4/1)', '((6*5)*4)/1', '(6*(5*4))/1', '6*((5*4)/1)', '6*(5*(4/1))'] ['(6*5)/4+1', '6*(5/4)+1', '6*5/(4+1)', '(6*5)/(4+1)', '((6*5)/4)+1', '(6*(5/4))+1', '6*((5/4)+1)', '6*(5/(4+1))'] ['(6*5)/4-1', '6*(5/4)-1', '6*5/(4-1)', '(6*5)/(4-1)', '((6*5)/4)-1', '(6*(5/4))-1', '6*((5/4)-1)', '6*(5/(4-1))'] ['(6*5)/4*1', '6*(5/4)*1', '6*5/(4*1)', '(6*5)/(4*1)', '((6*5)/4)*1', '(6*(5/4))*1', '6*((5/4)*1)', '6*(5/(4*1))'] ['(6*5)/4/1', '6*(5/4)/1', '6*5/(4/1)', '(6*5)/(4/1)', '((6*5)/4)/1', '(6*(5/4))/1', '6*((5/4)/1)', '6*(5/(4/1))'] ['(6/5)+4+1', '6/(5+4)+1', '6/5+(4+1)', '(6/5)+(4+1)', '((6/5)+4)+1', '(6/(5+4))+1', '6/((5+4)+1)', '6/(5+(4+1))'] ['(6/5)+4-1', '6/(5+4)-1', '6/5+(4-1)', '(6/5)+(4-1)', '((6/5)+4)-1', '(6/(5+4))-1', '6/((5+4)-1)', '6/(5+(4-1))'] ['(6/5)+4*1', '6/(5+4)*1', '6/5+(4*1)', '(6/5)+(4*1)', '((6/5)+4)*1', '(6/(5+4))*1', '6/((5+4)*1)', '6/(5+(4*1))'] ['(6/5)+4/1', '6/(5+4)/1', '6/5+(4/1)', '(6/5)+(4/1)', '((6/5)+4)/1', '(6/(5+4))/1', '6/((5+4)/1)', '6/(5+(4/1))'] ['(6/5)-4+1', '6/(5-4)+1', '6/5-(4+1)', '(6/5)-(4+1)', '((6/5)-4)+1', '(6/(5-4))+1', '6/((5-4)+1)', '6/(5-(4+1))'] ['(6/5)-4-1', '6/(5-4)-1', '6/5-(4-1)', '(6/5)-(4-1)', '((6/5)-4)-1', '(6/(5-4))-1', '6/((5-4)-1)', '6/(5-(4-1))'] ['(6/5)-4*1', '6/(5-4)*1', '6/5-(4*1)', '(6/5)-(4*1)', '((6/5)-4)*1', '(6/(5-4))*1', '6/((5-4)*1)', '6/(5-(4*1))'] ['(6/5)-4/1', '6/(5-4)/1', '6/5-(4/1)', '(6/5)-(4/1)', '((6/5)-4)/1', '(6/(5-4))/1', '6/((5-4)/1)', '6/(5-(4/1))'] ['(6/5)*4+1', '6/(5*4)+1', '6/5*(4+1)', '(6/5)*(4+1)', '((6/5)*4)+1', '(6/(5*4))+1', '6/((5*4)+1)', '6/(5*(4+1))'] ['(6/5)*4-1', '6/(5*4)-1', '6/5*(4-1)', '(6/5)*(4-1)', '((6/5)*4)-1', '(6/(5*4))-1', '6/((5*4)-1)', '6/(5*(4-1))'] ['(6/5)*4*1', '6/(5*4)*1', '6/5*(4*1)', '(6/5)*(4*1)', '((6/5)*4)*1', '(6/(5*4))*1', '6/((5*4)*1)', '6/(5*(4*1))'] ['(6/5)*4/1', '6/(5*4)/1', '6/5*(4/1)', '(6/5)*(4/1)', '((6/5)*4)/1', '(6/(5*4))/1', '6/((5*4)/1)', '6/(5*(4/1))'] ['(6/5)/4+1', '6/(5/4)+1', '6/5/(4+1)', '(6/5)/(4+1)', '((6/5)/4)+1', '(6/(5/4))+1', '6/((5/4)+1)', '6/(5/(4+1))'] ['(6/5)/4-1', '6/(5/4)-1', '6/5/(4-1)', '(6/5)/(4-1)', '((6/5)/4)-1', '(6/(5/4))-1', '6/((5/4)-1)', '6/(5/(4-1))'] 24點結果 = 6/((5/4)-1)"""?
總結
以上是生活随笔為你收集整理的1.Python算法之枚举算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.设计模式中监听模式(观察者模式)(P
- 下一篇: Java打印菱形(空格菱形)(星星之间有