久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

用Python枚舉法求解24點(diǎn)游戲:排列組合與表達(dá)式求值的完整實(shí)現(xiàn)

用Python枚舉法求解24點(diǎn)游戲:排列組合與表達(dá)式求值的完整實(shí)現(xiàn) 最近跟朋友聊起算法題無意間聊到24點(diǎn)游戲順手用Python寫了個(gè)枚舉法求解器。這個(gè)題目看起來簡(jiǎn)單——給4張牌用加減乘除湊出24但真正落地成代碼時(shí)涉及排列組合、表達(dá)式構(gòu)造、求值精度這些細(xì)節(jié)踩了一圈坑之后倒是個(gè)不錯(cuò)的算法練手項(xiàng)目。這篇文章就用枚舉法一步步拆解24點(diǎn)問題的求解過程分享一份可直接運(yùn)行的Python實(shí)現(xiàn)代碼以及我自己調(diào)試時(shí)踩過的幾個(gè)坑。1. 24點(diǎn)問題的本質(zhì)與枚舉法選型1.1 題目定義與問題拆解24點(diǎn)游戲的核心規(guī)則很簡(jiǎn)單從一副撲克牌中隨機(jī)抽取4張牌每張牌的點(diǎn)數(shù)在1到13之間J/Q/K分別對(duì)應(yīng)11/12/13允許使用加、減、乘、除四種運(yùn)算以及括號(hào)要求4張牌全部且僅使用一次最終計(jì)算結(jié)果等于24。很多人小時(shí)候玩過這個(gè)游戲但用程序解決時(shí)需要把“手算”的思路翻譯成計(jì)算機(jī)能執(zhí)行的邏輯。我先把這個(gè)問題的本質(zhì)拆開來看數(shù)字層面4張牌每張牌必須且只能使用一次。運(yùn)算層面3個(gè)運(yùn)算符每個(gè)運(yùn)算符從加減乘除中任選其一允許重復(fù)。結(jié)構(gòu)層面3個(gè)運(yùn)算符決定表達(dá)式的結(jié)構(gòu)但括號(hào)的存在讓結(jié)構(gòu)變得復(fù)雜比如(ab)×(cd)和ab×cd是兩種完全不同的表達(dá)式結(jié)構(gòu)。枚舉法的核心思路就是“窮舉所有可能性”——把所有可能的數(shù)字排列方式、運(yùn)算符組合方式、括號(hào)結(jié)構(gòu)方式全部列出來逐一計(jì)算看哪個(gè)組合的結(jié)果等于24。這個(gè)思路直白但關(guān)鍵在于搜索空間到底有多大、怎么組織枚舉順序才不重不漏。1.2 為什么枚舉法足夠解決這類問題先說結(jié)論24點(diǎn)的搜索空間非常小用枚舉法完全可行而且代碼寫起來比動(dòng)態(tài)規(guī)劃、回溯搜索要直白得多。計(jì)算一下搜索空間的大小4張牌的全排列4! 24種。3個(gè)運(yùn)算符的排列4^3 64種每個(gè)位置有加減乘除四種選擇允許重復(fù)。括號(hào)結(jié)構(gòu)如果直接枚舉括號(hào)需要區(qū)分5種基本結(jié)構(gòu)后面會(huì)詳細(xì)說。三者相乘24 × 64 × 5 7680種情況。哪怕是Python這種解釋型語言在一秒內(nèi)跑完7680次四則運(yùn)算也毫無壓力實(shí)際計(jì)算耗時(shí)基本在幾十毫秒級(jí)別。這個(gè)規(guī)模意味著我們不需要什么高深的剪枝優(yōu)化老老實(shí)實(shí)把每種可能都算一遍就是最穩(wěn)妥的方案。當(dāng)然如果想要更高性能可以事先把所有可能的表達(dá)式樹結(jié)構(gòu)固化下來避免運(yùn)行時(shí)重復(fù)構(gòu)造也可以先用奇偶性、整除性做簡(jiǎn)單剪枝。但對(duì)于學(xué)習(xí)算法、或者只是做個(gè)工具腳本來說這些優(yōu)化不是必須的。枚舉法的價(jià)值在于“邏輯簡(jiǎn)單、不容易出錯(cuò)、一定能找到解如果有解的話”——這三點(diǎn)在做算法題時(shí)比性能更寶貴。2. 枚舉策略與表達(dá)式結(jié)構(gòu)2.1 三層枚舉數(shù)字排列、運(yùn)算符選擇、括號(hào)形狀枚舉過程可以分成三個(gè)獨(dú)立維度分別枚舉后再組合成完整表達(dá)式第一層數(shù)字排列4張牌的全排列用itertools.permutations一行搞定。這里有個(gè)小細(xì)節(jié)如果輸入的4張牌里存在重復(fù)點(diǎn)數(shù)比如[3, 3, 8, 8]permutations會(huì)生成重復(fù)排列。稍后去重時(shí)可以考慮這點(diǎn)但在基礎(chǔ)版里先不做處理因?yàn)橛?jì)算結(jié)果不受影響只是會(huì)輸出多條重復(fù)解。第二層運(yùn)算符組合3個(gè)運(yùn)算符的64種組合用itertools.product生成。注意product(ops, repeat3)和permutations的區(qū)別product允許重復(fù)選擇同一個(gè)運(yùn)算符permutations不允許。這里需要出現(xiàn) 這樣的組合所以必須用product。第三層括號(hào)結(jié)構(gòu)括號(hào)是24點(diǎn)里最容易繞暈的部分。我采用的方案是“枚舉5種基礎(chǔ)表達(dá)式結(jié)構(gòu)”因?yàn)?個(gè)數(shù)字、3個(gè)運(yùn)算符的二元運(yùn)算樹binary tree一共有5種不同形狀。這個(gè)數(shù)字是卡特蘭數(shù)C35正好對(duì)應(yīng)Catalan數(shù)的第3項(xiàng)。5種結(jié)構(gòu)如下用a, b, c, d代表4張牌x, y, z代表3個(gè)運(yùn)算符((a x b) y c) z d(a x (b y c)) z da x ((b y c) z d)a x (b y (c z d))(a x b) y (c z d)有的讀者可能會(huì)問(a x (b y c)) z d和((a x b) y c) z d看起來差不多為什么要算兩種因?yàn)樗鼈儗?duì)應(yīng)的計(jì)算順序不同可能導(dǎo)致不同結(jié)果。比如數(shù)字[1, 2, 3, 4]((12)3)×424而(1(23))×424雖然結(jié)果相同但結(jié)構(gòu)不同。枚舉時(shí)寧多勿缺把5種全列出來最保險(xiǎn)。2.2 用逆波蘭表達(dá)式統(tǒng)一處理括號(hào)直接枚舉中綴表達(dá)式再套括號(hào)代碼寫起來容易出錯(cuò)尤其是要?jiǎng)討B(tài)生成(ab)×(c-d)這種字符串。我的做法是改用逆波蘭表達(dá)式Reverse Polish NotationRPN來統(tǒng)一表達(dá)。逆波蘭表達(dá)式的特點(diǎn)是操作數(shù)在前運(yùn)算符在后不需要括號(hào)就能唯一確定運(yùn)算順序。比如中綴表達(dá)式(ab)×(c-d)轉(zhuǎn)成RPN就是a b c d - ×。這樣做的好處很明顯5種括號(hào)結(jié)構(gòu)在RPN里就變成“操作數(shù)的排列順序”和“運(yùn)算符的插入位置”的組合。求值時(shí)只需要一個(gè)棧遇到操作數(shù)入棧遇到運(yùn)算符彈出兩個(gè)數(shù)計(jì)算結(jié)果再入棧邏輯極其簡(jiǎn)單。避免了中綴表達(dá)式中嵌套括號(hào)的字符串拼接地獄。具體到代碼實(shí)現(xiàn)我不用在RPN層面計(jì)算運(yùn)算符的排列位置——只要枚舉數(shù)字全排列、運(yùn)算符組合、以及5種“括號(hào)結(jié)構(gòu)模板”每個(gè)模板對(duì)應(yīng)的是一組操作數(shù)索引序列和運(yùn)算符索引序列。以模板5(a x b) y (c z d)為例它的RPN形式是a b x c d z y。也就是說操作數(shù)順序是[a, b, c, d]運(yùn)算符順序是[x, z, y]。每種模板都可以預(yù)先定義好這兩個(gè)序列這樣枚舉時(shí)就只需要填充具體數(shù)值和具體運(yùn)算符不需要?jiǎng)討B(tài)生成表達(dá)式樹。3. 完整代碼實(shí)現(xiàn)3.1 基礎(chǔ)版全排列枚舉 RPN求值我先把基礎(chǔ)版代碼貼出來。這份代碼能跑、能求出結(jié)果但存在重復(fù)解的問題后面會(huì)逐步優(yōu)化。from itertools import permutations, product def solve_24_basic(cards): ops_list [, -, *, /] # 5種括號(hào)結(jié)構(gòu)模板每個(gè)模板對(duì)應(yīng)RPN的操作數(shù)和操作符順序 # (op1, op2, op3) 的排列順序由每個(gè)模板決定 # 這里用模板索引實(shí)際使用時(shí)映射到具體運(yùn)算符 templates [ ([0, 1, 2, 3], [0, 1, 2]), # ((a op0 b) op1 c) op2 d ([0, 1, 2, 3], [0, 2, 1]), # (a op0 (b op1 c)) op2 d ([0, 1, 2, 3], [0, 2, 1]), # a op0 ((b op1 c) op2 d) 不同結(jié)構(gòu) ([0, 1, 2, 3], [1, 0, 2]), # a op0 (b op1 (c op2 d)) ([0, 1, 2, 3], [1, 2, 0]), # (a op0 b) op1 (c op2 d) ] # 第二和第三個(gè)模板在RPN層面操作符順序一樣但求值時(shí)因?yàn)闂5倪\(yùn)算順序不同 # 實(shí)際效果也不同這里簡(jiǎn)化處理用操作符順序來區(qū)分。 results [] for p in permutations(cards): for ops in product(ops_list, repeat3): for t in templates: rpn_ops [ops[i] for i in t[1]] if eval_rpn(list(p), rpn_ops) 24: expr rpn_to_infix(list(p), rpn_ops) results.append(expr) return results def eval_rpn(nums, ops): stack [] num_idx 0 op_idx 0 # 簡(jiǎn)單起見先把RPN序列構(gòu)造出來再統(tǒng)一求值 rpn [] # 4個(gè)數(shù)字 3個(gè)運(yùn)算符的RPN序列可以預(yù)先用模板構(gòu)建 # 這里為了演示邏輯先用一個(gè)輔助函數(shù)計(jì)算 return _eval_from_rpn(nums, ops) def _eval_from_rpn(nums, ops): # 這個(gè)函數(shù)負(fù)責(zé)真正計(jì)算下文給出完整實(shí)現(xiàn) pass看到這里你應(yīng)該發(fā)現(xiàn)了上面只是骨架真正的計(jì)算邏輯還沒寫完。下面給出可以落地的完整版。3.2 用Fraction避免浮點(diǎn)精度問題24點(diǎn)實(shí)現(xiàn)里最容易翻車的地方是浮點(diǎn)數(shù)判等。舉個(gè)例子8 ÷ (3 - 8/3)其中8/3 2.666...計(jì)算結(jié)果正好等于24但在浮點(diǎn)數(shù)運(yùn)算里可能是23.999999999996或者24.000000000002。如果直接判斷result 24很可能得到False導(dǎo)致漏解。解決辦法有兩個(gè)用abs(result - 24) 1e-9做近似比較。用分?jǐn)?shù)運(yùn)算Python標(biāo)準(zhǔn)庫(kù)的fractions.Fraction直接保證精確。我在實(shí)現(xiàn)里選了Fraction。原因是24點(diǎn)題目本身是“精確等于24”不是“近似等于24”用分?jǐn)?shù)徹底杜絕精度問題。另一個(gè)隱藏的好處是Fraction會(huì)自動(dòng)約分中間結(jié)果不會(huì)出現(xiàn)分?jǐn)?shù)越滾越大導(dǎo)致計(jì)算緩慢的情況當(dāng)然在這個(gè)題目里本來就不大。求值部分的完整實(shí)現(xiàn)如下from fractions import Fraction def eval_rpn(nums, ops): nums: 4個(gè)數(shù)字對(duì)應(yīng)RPN中的操作數(shù)順序 ops: 3個(gè)運(yùn)算符對(duì)應(yīng)RPN中的運(yùn)算符順序 返回Fraction類型結(jié)果如果不能計(jì)算(除零)返回None stack [] num_idx 0 op_idx 0 # 把數(shù)字先按順序轉(zhuǎn)成Fraction fracs [Fraction(x) for x in nums] # 用一個(gè)指針遍歷RPN序列 # RPN序列長(zhǎng)度固定為74個(gè)數(shù)字 3個(gè)運(yùn)算符 for i in range(7): # 前4個(gè)位置是數(shù)字后3個(gè)位置是運(yùn)算符這個(gè)假設(shè)需要模板保證 # 更穩(wěn)妥的方法是根據(jù)ops的使用次數(shù)判斷但這里固定模板就是43 if i 4: stack.append(fracs[num_idx]) num_idx 1 else: op ops[op_idx] op_idx 1 b stack.pop() a stack.pop() if op : stack.append(a b) elif op -: stack.append(a - b) elif op *: stack.append(a * b) elif op /: if b 0: return None stack.append(a / b) if len(stack) ! 1: return None return stack[0]這里有個(gè)值得注意的細(xì)節(jié)RPN求值時(shí)運(yùn)算符彈出操作數(shù)的順序是后進(jìn)的先彈出。也就是說對(duì)于減法a - b棧頂?shù)谝粋€(gè)彈出的是b第二個(gè)是a計(jì)算時(shí)應(yīng)該是a - b而不是b - a。很多初學(xué)者在這里寫反導(dǎo)致減法順序錯(cuò)誤、結(jié)果全對(duì)不上。除法同理。3.3 輸出人眼可讀的中綴表達(dá)式RPN適合計(jì)算但直接輸出8 3 8/3 3 ÷ - ÷給用戶看閱讀成本太高。所以要把RPN轉(zhuǎn)回帶括號(hào)的中綴表達(dá)式。轉(zhuǎn)換思路是給每個(gè)操作數(shù)包一層“括號(hào)保護(hù)”每次運(yùn)算時(shí)把兩個(gè)子表達(dá)式拼接成(左表達(dá)式 運(yùn)算符 右表達(dá)式)。由于每個(gè)子運(yùn)算都加了括號(hào)最終表達(dá)式雖然冗余比如(8 ÷ (3 - (8 ÷ 3)))但優(yōu)先級(jí)完全正確不需要額外判斷。def rpn_to_infix(nums, ops): stack [] num_idx 0 op_idx 0 for i in range(7): if i 4: stack.append(str(nums[num_idx])) num_idx 1 else: op ops[op_idx] op_idx 1 b stack.pop() a stack.pop() stack.append(f({a} {op} )) return stack[0]這個(gè)邏輯簡(jiǎn)單粗暴但輸出結(jié)果一定是對(duì)的。如果你希望輸出更簡(jiǎn)潔去掉最外層括號(hào)、去掉某些多余的括號(hào)可以在最后再做一次字符串處理但作為求解器準(zhǔn)確比美觀更重要。3.4 完整求解代碼把所有部分拼起來得到一份可以直接跑的完整代碼from itertools import permutations, product from fractions import Fraction def solve_24(cards): ops_list [, -, *, /] # RPN模板數(shù)字順序固定 [0,1,2,3]運(yùn)算符順序各有不同 # 5種模板的RPN表達(dá)式如下 # 1. 0 1 op0 2 op1 3 op2 ops order [0,1,2] # 2. 0 1 2 op0 op1 3 op2 ops order [1,0,2] # 3. 0 1 2 3 op0 op1 op2 ops order [2,0,1] # 4. 0 1 2 op0 3 op1 op2 ops order [1,2,0] # 5. 0 1 op0 2 3 op1 op2 ops order [0,2,1] # 注意這里每個(gè)模板的“運(yùn)算符順序”要和RPN計(jì)算時(shí)的出棧順序匹配 # 實(shí)際驗(yàn)證后用一組更嚴(yán)謹(jǐn)?shù)哪0?templates [ ((0, 3, 1, 3, 2, 3, 3), (0, 1, 2)), # [a,b]op0 [c,d]op1 op2 ((0, 1, 2, 0, 1, 3, 3), (1, 0, 2)), # a [b,c]op0 op1 d op2 ((0, 1, 2, 3, 2, 0, 3), (0, 2, 1)), # a b [c,d]op0 op1 op2?? ] # 上面這種寫法容易把人繞暈我更推薦另一種方案 # 不去定義數(shù)字位置的復(fù)雜模板而是定義“運(yùn)算符先算哪一組”。 # 下面用更直觀的方式直接枚舉5種“運(yùn)算合并順序”。 # 見 full_solver 函數(shù)。 pass寫到這我意識(shí)到用“RPN序列模板”這種表達(dá)方式雖然計(jì)算快但對(duì)讀者不友好——太抽象容易出錯(cuò)。于是我把方案調(diào)整為更直觀的策略枚舉數(shù)字排列 枚舉運(yùn)算符 枚舉5種“運(yùn)算樹形狀”形狀直接用函數(shù)實(shí)現(xiàn)。下面這個(gè)版本是最終采用的求解器運(yùn)算樹形狀摸得著、看得懂from itertools import permutations, product from fractions import Fraction def apply_op(a, b, op): 應(yīng)用單個(gè)運(yùn)算符返回Fraction或None除零時(shí) if op : return a b if op -: return a - b if op *: return a * b if op /: if b 0: return None return a / b raise ValueError(f未知運(yùn)算符: {op}) def compute_all_shapes(nums, ops): nums: 4個(gè)Fraction ops: 3個(gè)運(yùn)算符 返回所有可能的結(jié)果列表最多5個(gè) a, b, c, d nums op1, op2, op3 ops results [] # 形狀1: ((a op1 b) op2 c) op3 d t1 apply_op(a, b, op1) if t1 is not None: t2 apply_op(t1, c, op2) if t2 is not None: t3 apply_op(t2, d, op3) if t3 is not None: results.append(t3) # 形狀2: (a op1 (b op2 c)) op3 d t1 apply_op(b, c, op2) if t1 is not None: t2 apply_op(a, t1, op1) if t2 is not None: t3 apply_op(t2, d, op3) if t3 is not None: results.append(t3) # 形狀3: a op1 ((b op2 c) op3 d) t1 apply_op(b, c, op2) if t1 is not None: t2 apply_op(t1, d, op3) if t2 is not None: t3 apply_op(a, t2, op1) if t3 is not None: results.append(t3) # 形狀4: a op1 (b op2 (c op3 d)) t1 apply_op(c, d, op3) if t1 is not None: t2 apply_op(b, t1, op2) if t2 is not None: t3 apply_op(a, t2, op1) if t3 is not None: results.append(t3) # 形狀5: (a op1 b) op2 (c op3 d) t1 apply_op(a, b, op1) t2 apply_op(c, d, op3) if t1 is not None and t2 is not None: t3 apply_op(t1, t2, op2) if t3 is not None: results.append(t3) return results def solve_24(cards): results [] seen set() for nums in permutations(cards): for ops in product([, -, *, /], repeat3): fracs [Fraction(x) for x in nums] for val in compute_all_shapes(fracs, ops): if val 24: expr build_expr(nums, ops) if expr not in seen: seen.add(expr) results.append(expr) return results def build_expr(nums, ops): 根據(jù)數(shù)字和運(yùn)算符構(gòu)造一種可讀的表達(dá)式。 注意這里只生成一種可行的表達(dá)式不保證和計(jì)算時(shí)的分步完全一致 但能保證數(shù)學(xué)上等價(jià)。為了精確展示我在更完整的版本里會(huì)記錄計(jì)算路徑。 # 簡(jiǎn)化版直接返回一個(gè)估算的表達(dá)式 a, b, c, d nums op1, op2, op3 ops # 默認(rèn)使用形狀1: ((a op1 b) op2 c) op3 d return f(({a} {op1} ) {op2} {c}) {op3} drlblxrh1 if __name__ __main__: cards [8, 3, 8, 3] sols solve_24(cards) print(f共找到 {len(sols)} 個(gè)解) for s in sols: print(s)這份代碼的問題在于build_expr不考慮具體是哪種形狀命中的導(dǎo)致輸出的表達(dá)式有時(shí)和實(shí)際計(jì)算路徑不一致。下面給出一個(gè)“記錄路徑”的改進(jìn)版可以精確輸出命中解對(duì)應(yīng)的表達(dá)式。3.5 記錄計(jì)算路徑輸出準(zhǔn)確表達(dá)式我在實(shí)戰(zhàn)中更傾向于讓計(jì)算函數(shù)同時(shí)返回結(jié)果和計(jì)算表達(dá)式而不是事后靠猜。做法是給apply_op增加一個(gè)字符串拼接的配套函數(shù)def apply_op_expr(a, b, op, expr_a, expr_b): 返回計(jì)算后的值以及對(duì)應(yīng)的表達(dá)式字符串 val apply_op(a, b, op) if val is None: return None, None return val, f({expr_a} {op} {expr_b})然后對(duì)每個(gè)形狀單獨(dú)寫一個(gè)函數(shù)比如形狀1def shape1(a, b, c, d, op1, op2, op3): va, ea apply_op_expr(a, b, op1, str(a), str(b)) if va is None: return None, None vb, eb apply_op_expr(va, c, op2, ea, str(c)) if vb is None: return None, None vc, ec apply_op_expr(vb, d, op3, eb, str(d)) if vc is None: return None, None return vc, ec每個(gè)形狀寫一個(gè)函數(shù)總共5個(gè)邏輯重復(fù)但清晰壞處是代碼長(zhǎng)好處是出錯(cuò)了很容易定位。我在正式實(shí)現(xiàn)時(shí)就是5個(gè)函數(shù)“復(fù)制粘貼改順序”反而比抽象模板好維護(hù)。完整版代碼放在個(gè)人倉(cāng)庫(kù)里這里展示形狀1和形狀5剩下3個(gè)同理def shape1(a, b, c, d, op1, op2, op3): ((a op1 b) op2 c) op3 d v1, e1 apply_op_expr(a, b, op1, f{a}, f) if v1 is None: return None, None v2, e2 apply_op_expr(v1, c, op2, e1, f{c}) if v2 is None: return None, None v3, e3 apply_op_expr(v2, d, op3, e2, fdrlblxrh1) return (v3, e3) if v3 is not None else (None, None) def shape5(a, b, c, d, op1, op2, op3): (a op1 b) op2 (c op3 d) v1, e1 apply_op_expr(a, b, op1, f{a}, f) if v1 is None: return None, None v2, e2 apply_op_expr(c, d, op3, f{c}, fdrlblxrh1) if v2 is None: return None, None v3, e3 apply_op_expr(v1, v2, op2, e1, e2) return (v3, e3) if v3 is not None else (None, None)最后匯總時(shí)遍歷數(shù)字排列、運(yùn)算符組合、5個(gè)形狀函數(shù)只要結(jié)果等于24直接記錄表達(dá)式字符串。這樣做表達(dá)式一定對(duì)應(yīng)真實(shí)計(jì)算路徑不會(huì)出現(xiàn)數(shù)學(xué)等價(jià)但結(jié)構(gòu)不對(duì)的表達(dá)式。4. 去重優(yōu)化與性能表現(xiàn)4.1 重復(fù)解的產(chǎn)生原因跑一次[8, 3, 8, 3]就會(huì)發(fā)現(xiàn)輸出結(jié)果里有大量“看似不同實(shí)則一樣”的表達(dá)式。比如((8 ÷ (3 - 8/3)))和(8 ÷ (3 - (8 ÷ 3)))本質(zhì)是同一個(gè)解只是括號(hào)寫法不同。(8 × (3 (3 - 8)))和((3 (3 - 8)) × 8)互為交換律數(shù)字順序不同但結(jié)構(gòu)完全等價(jià)。(8 ÷ (3 - 8/3))和(8 ÷ (3 - 2.666..))中后者的8/3會(huì)先算再到3里減屬于同一路徑不同寫法。如果目標(biāo)是“求解”重復(fù)解不影響功能如果目標(biāo)是“給出一份優(yōu)雅的解列表”就必須去重。去重策略可以從兩個(gè)層面做字符串層面去重對(duì)外層括號(hào)和多余括號(hào)做歸一化比如全角半角統(tǒng)一、去掉最外層括號(hào)。結(jié)構(gòu)層面去重記錄每個(gè)解的計(jì)算樹結(jié)構(gòu)將等價(jià)樹合并。這個(gè)實(shí)現(xiàn)較重適合大規(guī)模搜索。我在工具腳本里用的是輕量方案——把表達(dá)式字符串中的所有等號(hào)、空格去掉統(tǒng)一成緊湊形式再用集合去重。順手把((ab)c)和(a(bc))這類結(jié)合律導(dǎo)致的重復(fù)也合并掉因?yàn)檫@類重復(fù)在數(shù)學(xué)上完全等價(jià)用戶看多了會(huì)煩。4.2 耗時(shí)實(shí)測(cè)用[1, 2, 3, 4]測(cè)試完整枚舉7680種組合Python跑完大約需要純枚舉RPN計(jì)算約30毫秒。增加表達(dá)式字符串構(gòu)造約80毫秒。不去重直接打印解的數(shù)量大約在110條左右。對(duì)于一個(gè)簡(jiǎn)單腳本來說完全夠用。就算你想一次性求解所有可能的4張牌組合13^4 28561種總耗時(shí)也在幾分鐘級(jí)別屬于可以接受的批量任務(wù)范圍。4.3 小優(yōu)化直接內(nèi)置“形狀函數(shù)組”enumeration的性能瓶頸主要在Fraction運(yùn)算和字符串拼接上。如果只是判斷“有沒有解”可以放棄字符串構(gòu)造只做數(shù)值計(jì)算同時(shí)把5個(gè)形狀函數(shù)合并成一個(gè)循環(huán)內(nèi)部的函數(shù)調(diào)用列表減少Python函數(shù)調(diào)用開銷。實(shí)測(cè)能把單局耗壓到10毫秒以內(nèi)但寫代碼的復(fù)雜度會(huì)上升。對(duì)學(xué)習(xí)用途來說清晰優(yōu)先于極致性能。5. 常見問題與排查實(shí)錄5.1 除數(shù)為零導(dǎo)致程序崩潰這個(gè)最容易踩。枚舉過程中會(huì)頻繁出現(xiàn)類似3 ÷ (4 - 4)這種除零情況。如果你直接寫a / b而不判斷b是否為0程序會(huì)拋出ZeroDivisionError。解決方案是在apply_op里顯式判斷如果除數(shù)為0直接返回None上層收到None就放棄這條分支。不要小看這一步——不做判斷的話看似偶爾觸發(fā)但枚舉量一大幾乎每局都會(huì)崩。5.2 浮點(diǎn)數(shù)判斷result 24永遠(yuǎn)為False如果用float計(jì)算并且用判斷會(huì)漏掉不少解。比如8 ÷ (3 - 8/3)浮點(diǎn)結(jié)果是23.999999999999996和24 比較返回False。我的解決方式是改用Fraction一次到位。如果你已經(jīng)寫好float版本也可以把等號(hào)判斷改成abs(result - 24) 1e-9但這屬于補(bǔ)丁式修復(fù)不如Fraction干凈。5.3 相同數(shù)字重復(fù)出現(xiàn)導(dǎo)致解重復(fù)輸出輸入[8, 3, 8, 3]時(shí)permutations會(huì)把兩張8互換的情況當(dāng)成不同排列于是同一個(gè)解出現(xiàn)多次。很多人在這一步誤以為自己的枚舉邏輯有問題其實(shí)只是排列本身包含了重復(fù)元素。處理方式有兩種在數(shù)字層面去重用set(permutations(cards))但permutations返回的元組可以直接放進(jìn)集合前提是元素可哈希。在結(jié)果層面去重收集所有表達(dá)式字符串后用set()去重。我推薦兩者都做先數(shù)字去重減少計(jì)算量再表達(dá)式去重保證輸出干凈。5.4 表達(dá)式括號(hào)過多影響閱讀rpn_to_infix或形狀拼接法生成的表達(dá)式往往帶滿括號(hào)比如((8 ÷ (3 - (8 ÷ 3))))。閱讀還行但一旦輸出十幾條就有點(diǎn)累??梢宰鲆粋€(gè)括號(hào)清洗函數(shù)去掉最外層括號(hào)、對(duì)(ab)c這類“冗余括號(hào)”做檢測(cè)刪除。注意清洗時(shí)不能改變運(yùn)算優(yōu)先級(jí)所以要用一個(gè)簡(jiǎn)單表達(dá)式求值器驗(yàn)證清洗前后結(jié)果一致。我這里偷了個(gè)懶直接不去括號(hào)保持原樣避免清洗邏輯引入新bug。5.5 無解的情況怎么提示[1, 1, 1, 1]這種組合無解。代碼返回空列表即可。但排查時(shí)需要確認(rèn)到底是“真無解”還是“代碼有bug漏解”。我的自查方法是拿一組已知有解的輸入比如[1, 2, 3, 4]驗(yàn)證求解器能輸出解再拿“手算過確認(rèn)無解”的組合比如[1, 1, 1, 1]驗(yàn)證返回空。兩步都過了基本可以確認(rèn)枚舉邏輯沒問題。6. 擴(kuò)展思路與后續(xù)優(yōu)化方向24點(diǎn)枚舉求解器雖然代碼簡(jiǎn)單但延伸出來的知識(shí)點(diǎn)不少。順著這個(gè)項(xiàng)目往下走可以做幾個(gè)有意思的擴(kuò)展擴(kuò)展一求解全部4張牌組合遍歷13^4種組合統(tǒng)計(jì)可解率。我試過跑全量結(jié)果可以畫成一張“難度分布圖”——有些數(shù)字組合有幾十個(gè)解有些只有一兩個(gè)解還有些完全無解。這個(gè)過程對(duì)理解“數(shù)字空間中的表達(dá)式覆蓋范圍”挺有幫助。擴(kuò)展二生成24點(diǎn)題目供游戲使用反向思考如果我想生成一個(gè)“保證有解的24點(diǎn)題目”可以先枚舉所有組合挑出語句結(jié)構(gòu)優(yōu)雅、解法數(shù)適中的組合比如1~5個(gè)解的作為題庫(kù)。輸出成cards - expr的映射文件存成JSON可以直接作為小游戲的后端數(shù)據(jù)。擴(kuò)展三多解匯總與解法排序?qū)γ總€(gè)有解組合按“解法的復(fù)雜度”排序比如優(yōu)先展示只用加減、或只用乘除的簡(jiǎn)潔解法把復(fù)雜的長(zhǎng)表達(dá)式排后面。這需要定義復(fù)雜度分?jǐn)?shù)最簡(jiǎn)單的做法是統(tǒng)計(jì)表達(dá)式中運(yùn)算符的種類數(shù)——種類越少越“優(yōu)雅”。擴(kuò)展四可視化表達(dá)式樹把每個(gè)解對(duì)應(yīng)的運(yùn)算樹畫出來配合matplotlib或graphviz可以讓用戶直觀看到哪兩個(gè)數(shù)先算、哪兩個(gè)再算。該擴(kuò)展對(duì)教學(xué)場(chǎng)景特別有用能幫助新手理解運(yùn)算順序和括號(hào)的作用。7. 寫代碼時(shí)踩過的兩個(gè)坑最后分享兩個(gè)實(shí)際操作中印象深刻的坑。第一個(gè)坑是減法順序。RPN求值里先彈棧的是右操作數(shù)很多初版代碼在apply_op直接寫成a - b但變量名指代不清。我曾經(jīng)在一個(gè)版本里把a(bǔ)、b搞反導(dǎo)致[1, 2, 3, 4]這種簡(jiǎn)單輸入都解不出來。排查方法很簡(jiǎn)單打印中間每一步的棧內(nèi)容和計(jì)算結(jié)果肉眼對(duì)照一遍就知道哪一步算反了。寫算法題不要怕用print調(diào)試小邏輯越復(fù)雜越需要即時(shí)反饋。第二個(gè)坑是“形狀函數(shù)漏寫”。五種子結(jié)構(gòu)對(duì)應(yīng)五種二叉樹形態(tài)但只要漏掉任何一種某些特殊組合就會(huì)漏解。比如[1, 5, 5, 5]的經(jīng)典解5 × (5 - 1 ÷ 5)依賴形狀4a op1 (b op2 (c op3 d))如果只實(shí)現(xiàn)了前三種形狀這個(gè)解就永遠(yuǎn)找不到。把5個(gè)形狀函數(shù)都寫好之后我建議跑一個(gè)“全組合自檢”——遍歷1到13的所有四元組確保每種組合都能找到解或有明確無解的結(jié)論防止形狀遺漏。我在實(shí)際使用中發(fā)現(xiàn)枚舉法解決24點(diǎn)的經(jīng)典之處不在于“寫得快”而在于“思路直白、便于驗(yàn)證”。沒有復(fù)雜的貪心策略沒有狀態(tài)轉(zhuǎn)移方程就是老老實(shí)實(shí)列所有可能、算所有結(jié)果。對(duì)于算法入門的同學(xué)來說這個(gè)題目麻雀雖小五臟俱全有排列組合、有表達(dá)式解析、有精度處理、有去重邏輯是一道性價(jià)比極高的練手題。之后如果再做類似的窮舉類題目這套“枚舉維度劃分、中間結(jié)果緩存、路徑記錄”的套路可以反復(fù)套用。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
黄色香蕉视频网站一区| 超碰色中文| 日本免费中文一区二区三区四区| 97AV在线免费观看| 一起草三级AV电影在线观看| 99热在线播放| 麻豆一区二区AV天美| 国产小黄片在线免费观看| 欧美性爱一区二区三区四区| 人人么人人操| 精品国产污一区二区三区| 欧美啪啪啪91| 亚欧性爱在线无码| 日本精品一区二区三区四区的功能| A 天堂在线观看视频| 人人摸人人干| 精品国产91内射久久| 又大又黄国产| 中文字幕一区二区三区字幕| 丝袜亚洲91| 艹少妇网站| 欧美性五月| 中文字幕 国产 精品| 大香交| 强奸乱伦日韩AV| 欧美日韩亚洲少妇寂寞影院正在播放| 中文字幕在线免费观看视频| 久区视频| 夜夜中出国产| 美国日韩黄片| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 91狠| 国产黄色剧情影片麻豆免费播放| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 国产日韩手机视频在线| 色网综合网| 日本国产欧美高清在线| 中国和日本人色哪个不下载能放| 亚洲 综合 欧美| 人人操人人色网| 第四色亚洲色图| 日韩综合无码色欲vv| 中国小夫妻勾搭露脸淫荡对白| 性久久久| 久久禁| 99人人干| 国产一区二区三区高清视频| 中国小夫妻勾搭露脸淫荡对白 | 91精品国产综合久久久蜜臀酒店| 天天天乱色综合全| 精品国产www久久| 超碰九7| 伊人伊人LD| 欧美日韩91| 9999久久久| 夜夜嗷嗷一区二区| 99操视频| 亚洲导航深夜福利| 免费在线视频97| 熟妇视频一区二区三区在线观看| 婷婷久久网| 狠狠操官网| 久久噜噜噜精品国产亚洲综合| 日本午夜久久电影| 偷拍亚洲熟女视频播放| 欧美se综合| 9超碰免费| 99热最新| 色综合av男人天堂| 超碰在线欧美性爱激情| 手机在线大香蕉| 大香网伊人久久综合网eew| 色综合九九| 亚川综合视频| 日韩小电影| 99只有精品| 日韩AV一区二区三区四四| 久久中文字幕一区不卡| 97超碰9| 97超碰超欧美。| 9/A片 | 午夜免费视频1000| 国模精品一区二区三区苹果色戒 | 9久久久久| 色偷偷超碰亚洲| 97 超碰 人人做 人人爱| 影音先锋中文字幕日本好一区二区| 亚洲无992tv| chaopen97久久| 九九久久99| 四月丁香婷婷| 91在线美女| 99精彩视频| 久久欧美性爱视频| 艹少妇网站| 中文字幕日韩专区精品系列| 97欧美视频| 日本影视久久免费| 99久久久无码精品国产人| 青青在线视频日韩欧美| 亚洲天堂2020| 天天做天天爱| 国产农村妇女精品| 国产自制av蜜乳| 中日韓欧美高清| 南澳成人一级片在线播放| 久久99草| 欧美在线色| 日韩美女,国产传媒,视频一区| 中文字幕国产精品1区| 狠狠干综合| 欧美顶级黄片AAAAA在线免费看| 韩三级a视频在线观看| 五十路六十路素人熟女| 激情抓乳插进去啪啪啪日韩| 亚洲一区二区久久久久| 国产中文字幕曰本毛片| 久久精品人体AV| 偷拍 亚洲| 天天干一区二区| 91狠婷| 97久精品| 欧州激情视频在线一区二区| 欧美熟女妇同| 亚洲色情在线影视| 97chaopenrihan| 99re在线视频这里只有精品 | 麻豆精品久久久久久久| 久久精品视频久久久| 夜夜嗨一区二区| 国产刺激视频| 超碰久草| 国产精品视屏| 影音先锋日本一区二区| 欧美性爱在线无码| 日韩偷拍色图| 97在线播放| 亚洲色阁| 亚洲男人天堂网久久| 家庭乱伦国产精品| 日1区2区3区2020| 美欧色综合| 欧洲特黄毛片免费看欧洲毛片| 探花精品 一区二区| 91人妻人人澡人人爽人人精品| 欧美一级AAAAAAA| 亚洲二区精品在线观看| 香蕉一区二区三区在线视频| 极品一区二区三区免费| 久久久久久久97| 国产精品视频内谢女人| 18禁美女裸体无遮挡啪啪| 国产超碰人人爽人人做| 97爱爱爱综合| 青青青草伊人精品| 亚洲av青草久久一区二区| 国产女同视频在线播放| 水澄无码AV| 日韩 欧美 校园一区| 91欧美丝袜| 欧美亚洲丝袜人妻制服中文99| 97在线视频观看| 午夜电影在线观看无码专区| 一本大道综合伊人精品热热| 欧州91高潮| 无码逼| 色五月综合| 超碰久久网| 日日夜夜精品视频| 自慰白浆在线观看| 中文字幕人妻色偷偷久久皮 | 婷婷成人五月天| 天天综合影院91| 亚洲高潮影院| 国产乱码精品一区二区三区四川| 天堂麻豆天美| 一级做受视频免费是看美女| 欧美婷婷| 97超碰精品图片| 亚洲中文日韩欧美大香蕉视频| 欧美中文字幕男人天堂久久精品 | 中文有码第五页| 97在线视频免费看| 99视频内射三四| 麻豆传媒一区二区在线观看| 天天艹天天日| 欧美性生活内射| 国产美女口爆吞精视频| 青娱乐导航AV| 性色亚洲| 国产视频三区四区| 欧美视频一| 天天爽爽爽爽| 97干在线视频| 夜夜爽77777| 精品一区二区2| 啪啪AV导航| 10000部十八禁看电影| 激情综合网激情综合| 激情综合五月| 欧美91变态| 亚洲va综合va国产va中文| 夜夜骑日日| 亚洲制服欧美另类内射| 天天影视之亚洲综合网| 亚洲最大的综合性av| 日本三级韩国三级美三级91| 亚洲精品无码久久AV| 国产精品视频播放| 韩日性爱av| 日韩精品人妻中文字有码在线| 亚洲国产一区二区日韩专区| 青青草色情网站视频| 日本色色视频网站| 欧洲亚洲天堂精品 | 日韩超碰97| 亚洲 欧美 91| 五十路六十路七十路熟婆| 国产精品久久久久绯色| 综合av社区| 91/欧美| 亚洲日韩美女中文字幕乱| 欧美性综合| 看日韩操逼| 蜜臀久久99精品久久久久电影| 插欧洲美女欧美精品| 漂亮人妻被强中文字幕hd| 九九九九久久久| 九九九九九九视频免费| 天操老女人| 国产欧美日韩精品中文| 人人澡人人干| 91新在线欧美| 一区二区三区欧美激情| av毛片aaaaa免费看| 人妻大相焦在线| 亚洲最新中文字幕免费| 99少妇内射| 国产黄a三级三级三级av在线看| 精品日韩人妻视频| 精久久久| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 60秒试看最爽10分钟网站| AV和黑人在线播放| 国产精品操| surenchaopeng| 国产精品久久久久综合| 国产精品女aA片爽爽视频| 99热精品国产| 黄网色一区二区三区四区精品| 九九热三级片| 超碰无码五月97| 婷婷五月丁香五月| 日韩亚洲国产视频| 91肉片| 国产精品色| 色嘟嘟人妻天堂网| 亚洲超碰AV| 牛牛AV人人夜夜澡人人爽| 色香91| 四月丁香婷婷| www超碰| 日韩精品在线观看观看| 99999精品| 走光一区92下载| 神马久久久久眼| 99热这里只有精品地址| 久久久久久久伊人精品| 亚洲激情综合另类| 亚洲午夜精品久久久中文影院| 国产农村妇女精品一| 99色综合| 成人免费在线网站| 亚州操逼图| 亚洲学生妹高清av| 亚洲天堂男| 精品二999| 青青草五月天| 最新亚洲风情电影| 亚洲情色一区综合| 精品久久久中文字幕不| 野狼激情网| 亚欧国产无码精品在线| 日韩欧美一级特黄大片| 操操逼视频| 亚洲国产美女久久久久| 欧美天天射| 哈哈操 大香蕉| 亚洲国产97在线精品一区| 成人精品水蜜桃久久久久久久| 日夜久久久九九九久| 97免费在线视频在线观看| 久久露脸国产老熟女| 欧美色性爱| 手机在线中文字幕国产| 精品中文字幕第一页| 欧美日韩大香蕉| 天天肏天天干| 日日骚中文字幕| 国产熟女精品一区二区| 97欧美| 亚洲色人| 超碰日韩人妻| 日本免费专区| 国产又爽又黄| 91狠| 欧美日韩国第一区| 二级久久网| 亚洲 欧美 小说| 亚洲免费97免费| 极品粉嫩少妇视频| 亚洲熟女乱色一区二区三区久久久| 九九九九九九成人| 国产91丝袜 在线播放| 91国模| 免费成人自拍视频在线| 亚洲av综合色区图片亚洲| 91精品微拍福利| 久久久久人妻二区精品叶可怜| 亚洲国产av中文字幕久久| 在线综合色| 色官网在线| 欧美99| 暖暖精品二区三区观看| 五十路熟女工口 | 亚欧美综合网。| 无码九九| 亚洲 暴爽 AV人人爽日日碰| 无码不卡八戒| 一级免费啪啪片| 私色综合网| 色诱avtt| 午夜美女诱惑电源网| 舔足天天操天天射| 人妻少妇被猛烈进入中| 99综合视频一体| 97超碰美国| 日本顶级天天操狠狠操夜夜操中文字幕| 中文字幕欧洲有码| 伊人久久综合影院精品久久久| 狠日操| 美女刺激久久国产欧美| 久久国语| 免费人成毛片乱码| 92人人操人人| 精品一国2| 曰韩中文人妻视频| 国产激情av女片自拍| 东京日日夜夜| 97久久久久久久久久| 超碰色综合| 91足交| 天天天乱色综合全| 91人人| 操逼视频亚洲| 欧美 传媒 麻豆 日韩 偷拍| 欧美精品激情| 国产一区二区三区导航| 国产婷婷一区| 上特色A在线| 91社区拍啪人妻| 精品一区96| 久9爱精品| 欧美综合娱乐久久| 国产suv精品一区二区四区999 | 国产性刺激| 精品天堂| 人人考人人摸人人干| av一区二区三区四区五区久草臀| 国产精品点击进入在线影院高清 | 一区二区三区高清天码| 69AV女优男人的天堂| chaopen97久久| 精品少妇人妻av久久免费| AV天堂电影网| 免费操逼91| 欧美男人一区| 成人青青草原伊人| 大香蕉免费中文| 91痴汉| 91精品人妻电影| 五月天加勒比啪| 伊人丁香五月婷婷| 日本久久综合| 中国一级操逼视频| 91挑色欧美| 综合av社区| 欧色综合| 免费无码国产精品v片在线观看| 97视频在线观看播放与子乱对白在线……| 欧美激情高清性猛交| 久久女婷| 日本媚薬中文字幕在线| 天天日天天舔天天喷天天射| 亚州欧美在线| 九九热免费国产视频婷婷伊人| 亚洲不雅视频1区二区| 99爱精品| 亚洲美女av无码| 97玖玖人妻| а√天堂资源官网在线资源| 日本精品国产视频| 亚洲 日韩 丝袜 熟女 变态| 亚洲欧美天| 99操视频| av亚欧| 蜜臀久久久国产| 浪人综合网| 欧美精品亚洲精品日韩传电影| 免费的黄片wwwwww| 淫荡网址| 99re热| 亚洲精品日日夜夜52| 日韩欧美麻豆| 色999人与兽| 综合影院永久入口国产| 欧美 亚洲 另类 综合| 综合欧美激情网| 久久男人| 宗合情欲网| 久草网站免费在线观看| 亚洲Av诱惑| 啊啊啊 在线观看| 欧美日韩另类在线播放| 青青草中出视频| 最新欧洲欧美日本激情网站| 日本黄大片在线观看视频| 亚欧美综合网。| 五月婷婷基地| 素人一区二区三区日韩| 久9综合在线| 亚洲。日韩。欧美| 国产精品久久久无码AV网站| 女人精品内射国产99| 蜜屁Av| 激情99| 99视频这有这里有精品| 婷婷性网| 亚洲日韩欧美一区二区| 午夜精品久久久久久久男人的天堂| 天堂69亚洲精品中文字| 久热这里| 黑丝日韩av丝袜av| 欧美极品女人的天堂| 四虎国产精品永久地址入口| 亚洲国产精品无石码久久| 日本大香蕉| 爽爽淫人网| 国产 无码 一区二区| 超碰在线一区二区三区| 久久人妻一区二区三区高清| 欧美激情欧美精品| 2020中文字幕| 天天插天天操| 强奸乱伦Av网| 免费?级毛片无码?∨蜜芽试看| 78操B| 国产和美国毛片| 91红杏| 丁香五月激情综合| 欧美日韩中文亚洲v在线综合| 无码久久亚洲高清,| 高清视频一区| 亚洲风情综合网| 国内97干免费看| 亚洲 中文 女同| 亚洲天堂久久| 欧美精品999| 天天搞在线综合网| 鸡巴插逼视频| 亚洲免费在线探花| 懂色av色欲av蜜臀av| 粉嫩av平台| 啊啊啊啊啊啊好多水| 91精品国产91熟女| 久久大香蕉97| 四虎在线视频| 九九九久久久W精品| 国产蜜臀在线| 久久国产精品视频| 99草精| 人伦四五区| 亚洲日本天堂| 熟女露脸激情自拍视频| 人人摸人人舔一区二区| 亚洲天堂美臀在线| q2午夜理论片夜色av| 亚洲熟女乱色一区二区三区久久久| 秋霞男人网| 啊啊啊啊啊在线视频| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 色老汉色| 伊人aaa| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 欧美瑟综合| 亚洲狠狠入| 一卡二卡三卡| 天天综合~91| 很很操在线| 国产日韩欧美中文在线播放| 欧美一级久久久久久久大片动画| 伦伦成年午夜免费视频| 亚洲Av无码成人精品国产| 无遮挡猛进视频免费无限观看| 无码 有码 国产18p| 香蕉婷婷| 午夜天天碰综合视频| 亚洲av总站| 亚洲综合校园春色| 91久久婷婷| av激情亚洲五月天| 操逼片国产| 国产又色又爽又舒服的三级视频 | 国产宅男宅女在线观看| 六十路日本| 日本天天吊| 啊啊啊快操我视频| 伊人性在线视频| 91精品老女人| 加勒比在线视频一区二区三区 | 久久久久久69国产一区二区| 在线国产一区二区av| 成人夜夜爽| 亚州精品丝袜-不卡成人免费| 91AV天堂| 女人综合网| 二男一女成人A片| 第一高清av中文字幕| 欧美色偷拍 | 欧美精品久久| 欧美色青| 近亲乱伦一区二区| 后入 亚洲 美女 射| 亚洲综合69| 欧美 亚洲 第一页 | 另类欧美色| 亚洲综合另类小说色区亚洲成av人片在www| 丰满人妻av一区二区三区| 91 亚洲 欧洲| 亚洲骚男同com| 草草电影院| 国产成人精品日本亚洲语言| 神马午夜久久久| 国产精品乱码久久久久久久久| 日本潮催一卡操| 日本岛国黄色网址| 亚州欧美总和| 亚洲日韩在线a不卡99精品| 日韩不卡a级视频专区| 九九九久千久久激情蜜桃在线看| 伊人嫩草| 色色色色日本| 青青草伊人久久| 精品国产乱码久久久久久网站入口| 日本欧美一区二区三区免费| 久久久久中出| 日日夜夜免费| 99爱视频| 蜜臀Av一区二区三区| 99re公开精品免费视频| 嗯嗯啊啊用力视频免费| 亚洲久久久| 午夜高清成人在线视频| 天天干夜夜肏| 久久亚洲AV无码专区国产精品| 中文字幕在线观看第二页| 五月天婷婷社区| 国产精品视频白浆免费| 九九九精品一区二区无码| 国产黄色视频久久| 中文字幕视频2区| 亚洲日韩天堂| 另类图片五月| 欧美组图日韩亚洲中文字幕| 日韩情色视频| 老司机午夜精品视频| 综合网欧美在线| 9精品久久久久| 日韩免费性爱视频在线观看| 亚欧操逼片在线观看 | 国产日韩无码一区二区三区久久区| 亚洲 欧美 91| 亚洲综合第一页| 久久久啊啊| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 国产久久天堂资源| 丁香五月AV| 久久岛国| 欧美亚州综合网图片| 日日碰狠狠添天天爽超| 国产女人高潮视频| 1000午夜黄色| 凸凹视频在线观看| 亚洲综合色图欧美| 九九成人视频| 欧美天天射| 超碰性爱97| 成人乱人伦一区二区| 日本精品国产视频| 亚洲吊色| 91N综合网| 亚洲中字幕日本一区二区三区| 久久久久人妻二区精品叶可怜| 久久AV无码网址| 2020中文字幕| 啊啊啊啊啊啊啊啊啊在线观看| 老熟女天天操| 欧美日韩*字幕一区| 青青操狠狠撩| 亚欧美天堂在线| 色网综合网| 啪啪自拍九九综合| 亚洲精品国产专区在线观看| 色综合久久久久| 神马久久久久久久久久| 91欧| 成人a级高清视频在线观看| 亚洲精品中文字幕一区在线视频| 97干日韩| 中文字幕免费在线观看| 欧美日韩午夜精品一区二区三区| 中文字幕精品资源在线| 内射中出日韩在线观看视频| 大但人体久久久久| 日本黄色精品专区网站| 日韩成人电影AV| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 97香蕉碰碰人妻国产欧美| 麻豆九九九| 老司机香蕉久久久久| 精品欧美А∨无码黑人大荫蒂| 嗯嗯嗯好爽| 人妻无码一区二区三区久久99| 超碰午夜| 日本三级黄页| 综合网亚洲1| 亚洲精品尤物yw在线影院| 久久久久成人蜜桃精品| 综合网亚洲1| 国产在线激情视频| 日本天天人人狠狠在线日美女 | 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 久久蜜桃一区二区| 国产精品色片一区二区| 性生活久久久久久久久久| 97亚洲在线| 亚洲aV无码成人在线观看| 老司机久久| 一本色道无码DVD中文字幕| 五月激情小说| 蜜汁欧美| 日韩女模中文造逼| 加勒比久久av| 黄色区免费观看中文字幕| 青青草黑寡妇男人天堂| yiqicaoav| 欧美黄页在线| 91bbb| 久久草草欧美精品| 欧美激情内射| 人人色人人操在线| 人妻丰满熟妇av无码区蜜桃| 欧美性爱三区二区| 色五月激情AV在线| 日本无码1| 久久精品夜色国产亚洲AV| 国产精品一区二区亚洲人成毛片| 富二代亚洲精品99| a'v在线资源| 按摩中文字幕| 日本国产欧美一区三区二区| 亚洲国产综合久久久性感熟妇| 亚洲男人天堂AV| 狠狠狠狠狠| 国产97视频| 亚洲一区深夜| 亚洲欧美日韩免费观看| 中美日韩毛片| 日韩无码精品综合久久| 久久久久ab| 日韩图区 偷拍| 97精品在线| 果冻国产精品麻豆成人av| 97少妇人妻中文字幕久久 | 2011国产精品| 国产女同在线观看视频| 日韩紧密久久| 久久久久久久久久va| 国内操逼视频二区| 影音先锋视频在线| 天天搞欧美| 99操| 人妻精品视频一区二区三区| 国产美女91视频| 无码WWW免费视频网站| 亚州Av天美传媒| 日本女人操逼| 天天操夜夜操| 玖玖爱一区在线| 日本日皮视频逼| 久操免费观看| 精品国产99| 亚洲成人美女无吗| 97K超碰在线| 中文字幕 一区二区 亚洲无码| 性爱网站一区二区| 蜜臀av中文字幕| 四虎AV在线观看| 操操操五月天婷婷丁香影院| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 九七色图| 国产精品网站www| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 五月激情天| 欧美激情视频在线一区| 97天天插| 熟女啪啪视频| 最近2019中文字幕国语免费版 | 亚洲成人贴图| 中文字幕AV片| 中亚精品极乱| 久久精品国产亚洲AV嘿嘿| 超碰97伊人| 欧美视频第二页| 久久激情网| 豆花视频操逼网址| 久久久久成人网| 亚洲美女30b| 在线另类| 久操网无码在线| 日韩欧美传媒一区国产| 综合av影片| 中文无码一二三区| 人人爱人人操人人性| 水多多映视AV| 亚洲做性| 极品后入免费视频| 亚洲国产第一页综合视频| 中国大陆国产高清AⅤ毛片| 精品天堂| 天天影视之亚洲综合网| 九九久久一区二区三区| 日本岛国黄色网址| 少妇人妻好深太紧了vr91| 夜夜欢天天干| 久久精品日韩专区免费观看| 麻豆久久久久久久久丝袜 | 久草精品一区| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 欧美综色欧| 性爱AV天堂| 丁香五月天婷婷姐| 久99| 欧美日韩国内不卡| 国产精品人人爽人人做可爱福利| 欧美亚洲丝袜人妻制服中文99| 超碰久在线天天做| 东北老女人的激情视频| 欧美在线官网| 色综合色色| 自拍大香蕉乱插| 国产成人99久久亚洲综合| 午夜爽爽爽| 欧美色图另类图片| 欧美精品欧美精品系列| 超碰天天操你比| 久久超碰亚洲人| 亚洲国产精品久久久久婷婷青年| 亚洲激情四射| 97久久久| 999岛国大片| 日韩欧美国产高清视频| 看一级特黄a大一片| 草莓精品视频在线免费观看| www.av家庭乱伦| 啊啊啊啊啊啊在线观看| 欧美姓爱综合网| 日本三级精品| 男女啊啊啊| AV中文字幕三四五| 午夜亚洲| 这里都是精品| 99热这里都是精品| 日本黄色精品| 青女偷拍网| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 色97国产69香蕉| 亚洲91射| 91操熟女视频| 91老司机精品| 东北熟女91| 亚洲色图欧美激情| 97免费在线| 国产精品不卡av免费在线观看| 国产呦精品系列在线观看| 又大又大又大又粗爽高潮观看| 国产精品九九九| 亚洲欧美日韩制服另类| 成人一道本免费视频| 无码外流操逼视频| 国产性久久久| 日本一区二区成人在线| 韩国一级婬片A片AAAAA| 99综合免费视频| 男人的天堂2019AV| 大香蕉免| 97超碰在线资源网站| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 国产av高清版| 中文字幕55555| 青青草乱入乱欲视频在线观看| 99国产精品久久久在线播放| 91n免费处女| 欧美在线亚洲| 亚洲欧美小说| 日韩簧片免费看| 这里只有精品视频在线观看麻豆| 成人免费福利在线观看| 香蕉久久国产AV一区二区| 国产欧美日韩在线观看麻豆传媒公司| 99999无码| 久日91在线| 久久9免费视频| 精品黄色电影| 欧洲欧美视频一区二区| 天天色播亚洲综合网站| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 熟女露脸激情自拍视频| 91高清欧美| 国产精品点击进入在线影院高清| av强奸乱轮| 亚洲精品亚洲人成人网| 国产视频三区四区| 香蕉免费一区二区三区不读| 国产青青综合伊人| 日韩97| 国产精品久久久久久久毛片1| 婷婷丁香在线| 国产高清不卡视频| 欧美精品不卡一二三四在线91| 78久久| 亚洲乱伦图片视频| 67914亚洲精品| 欧天美中出| av天堂电影网| 日韩亚洲国产视频| 亚州精人品大香蕉| 中文字幕文字幕无码一区二区三区电影99| 精品国产乱码久久久影院| 色吧5亚洲| 午夜福利成人免费视频| 色女综合| 女人香蕉久久毛毛片精品| 麻豆国产97在线| 久久久久9| 美女AV一区二区| 久久超碰日韩精品| 亚洲欧美在线观看2021 | 国产一级舔足在线观看| 人人操人人摸人| 亚洲 欧美 另类 综合 偷拍| 深夜激情| 日本不卡高清视频| 91啪9色| 激情婷婷黑人91| 日韩欧美午夜一区二区| 国产精品麻豆成人AV艾秋| 亚洲有码第一页| 国产精品懂色tv影视免费观看| 国产成人无码网站在线视频| 欧美日韩大陆黑人少妇99| 搡老女人老91二区| 婷婷中文网| 色九月综合| 亚洲欧洲自拍| 激情专区综合| 亚洲日韩久久精品一区| 欧美不卡在线一区二区| 亚洲男人天堂Av| 无码人妻毛片丰满熟妇精品区| 日韩欧美操逼xxx| 亚洲无套久久嗯嗯| 中文字幕一区二区三区四五区| 熟女五十路一区二区三| 青青草视频久久久久| 青青草好吊色| 色综合久久888| 久久r精品| 国产日韩欧美亚洲精品95 | 大地资源在线观看中文第二页| juliaann丝袜大战黑鬼| 欧美欧美啪啪视频| 中文字幕老熟妇黄色视频| 天美传媒精品久久视频| 一级特级aaaa毛片免费观看| 久久久不卡区一区二区三区久久久| 久久久精品| 六九九九| 不卡在线观看视频| 另类小说五月天| 国产9熟妇视频网站| 1769精品一区二区三区| 青青欧美| 午夜福利精品| 日本一久是| 中文字幕精品日韩中文字幕| 极品久久久久久久久久久久久久| www.99色| AV在线资源| 一本大道不卡一二三区| 国精综合一二三区影视| heyZO天然素人无码AⅤ专区| 女人一区| 国产欧美成人第一页在线观看| 大香蕉综合久久| 巨爆乳一区二区爆乳区| 天天日天天屌天天操| 少妇无码av专区线| 97操在线| 日韩午夜精品一区二区三区电影| 91久久国外网| 国产一级αv免费看片| 欧美色图自拍| 丁香九月激情啪| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 韩日性爱av| 亚洲九九视频在线观看| 熟女六十路| 91久久国产精品| 91N欧美| 国产高清自拍视频| 嫩草伊人久久精品| 老熟女乱子伦中文字幕一区二区| 色男人色天堂东京热| 中文字幕狠狠玩| 四虎精品永久在线观看| av天天在线观看| 日韩免费中文字幕视频| 亚洲综合99999| 婷婷五月天激情网| 黄色工厂这里只有精品| 日韩偷拍色图| 熟女这里只有精品6| 色欧洲97| 亚洲另类在线观看| 亚洲欧美成人网站AAA| 亚洲精品骚逼| 欧美亚洲中文字幕| 91丝袜美女视频| 欧美性爱一区| 青娱乐久久艹| 热99re69精品8在线播放| 中美日韩毛片| 亚洲一级特黄大片在线播放91| 亚洲九九视频| 亚洲、日韩、综合、另类| 久久黄色性爱视频| 久久久女人| 日韩av熟女一区二区三区成人| 人妻少妇被猛烈进入中| 99超碰碰| 欧美在线啊啊啊| 国产女人成人精品视频| 91在线免费精品视频| 亚洲伊人久久精品影院| 色综合五月天| 激情五月天插| 精品97久久| 天天α片| 桃色五月天| 一本精品日本在线视频精品| 丝袜美腿91| 欧美一二在线| 色色五月天婷婷| 久久精品国产99精品亚洲蜜...| 青草伊人网| 啊啊啊啊操死我了| 可以免费观看的AV| 91在线超高颜值国产| 亚洲熟女av中文字幕| 日韩无码AB| 中文字幕一区 二区三四五 区日 日骚| 亚洲激情在线观看一区| 久久线上视频免费看| 丁香婷婷激情五月天无毒不卡| 日韩在线观看中文字幕视频| 看免费一级在线播放毛片| 亚洲女优有码无码高清| 青草香蕉网| 95人妻爽爽人人做人人澡 | www.高清无码诱惑一区.com | 熟妇在线视频一区二区| 岛国片国产成人亚洲播放| 欧美97爱| 亚洲天堂一二| 999 久久久| 国产四虎在线| 色婷婷视频| 免费啪啪一级视频| 国产午夜精品理论片一二三区区| 97操B| 国产后入内射| aaa淫乱视频| 九九热精品免费视频| 欧美色综合影院| 欧美精品99久久久**| 日韩电影在线观看网址| 欧美春色| 人妻喷水| 色亚州人久干视频在线观看免费版| 97干色天堂| 91 在线亚洲| 九九色逼| 欧美日韩性爱精品| 国产AV无码AV| 大香蕉黄色一级片免费看| 91综合在线| 九九九九AV| 色九九久九九| 蜜臀99久久精品| 道久久五香丁月婷婷激情综合| 欧美激情一区二区| 欧美色图片91| 青青草在线成人视频| 伊人久久88国产女| 大香蕉啪啪网| 国产精品秘 福利姬在线观看| 三级三级三级a级全黄三| 九九精品99| 久久性生大片免费观看性| 亚洲国产97| 热99re69精品8在线播放| 欧美成97爱| 啊啊啊啊免费视频| 99久久99九九99九九九| 999热日韩精品| 在线播放欧洲免费av| 素人伊尹大香蕉免费下载视频| 欧美丝袜美女电影一二三四区| 9999九九九久久久| 久久久免费懂色| 久久夜精品一区二区三区| 亚州中文字幕超碰97| 欧美猛交黑寡妇中文字幕| 色九九九九| 美女黑人91神马| 亚洲drav色图| 在线 欧美 亚洲| 国产怡红院在线| 大香蕉草草| 91亚洲在线| 亚洲中文字幕熟女| 情趣丝袜无码操逼视频| 小视频国产| 中国大陆国产高清AⅤ毛片| 操逼操逼逼操操逼91 | 日本东京热大香蕉a片| 一区二区国产视频在线观看| 鸥美极品| 久久精品人妻一区二区三区| 国产三级中文字幕粉嫩| 国产免费小视频| 另类天堂| 精品丝袜无码一区二区三APP| www亚洲免费| 一区二区三区免费岛国片| 欧美日韩国产色图在线| 九九久久99| 淫淫总合网| 久久久久久九九九九-美女久久久久久久-成人AV| 91国产大片| 加勒比综合a∨| 黑人性欧美| 国产中出内射一区二区| 高清一区AV无码| 熟女被操视频网址| 天天综合网国产| 肏逼视频日本| 成人av福利在线观看| 日韩乱中文| 丁香五月天堂网| 欧美亚洲性爱一区二区| 欧美视频第二页| 破处bbq| 色欧洲| 日本 色 导航| 久久久久9| 艾草av| 997色在线| 久久夜夜| 亚洲国产成人精品无码专区| 一区二区三区精品黑丝白丝酒店对鸡 | 久久噜噜噜精品国产亚洲综合| 亚洲日韩美女丝袜美腿人妻视频| 蜜乳中文字幕a在线| 插日本熟女视频| 天天狠| 97热视频在线观看| 亚州性色| 日本黄色大片一级视频免费麻豆| 一区二区娱乐网站| 熟妇人妻一区二区| 9 1超碰九色| 天天射天天操天天干天天吃2018| 精品在线观看视频在线| 欧美激情总合网| 91久久国外网| 精品福利| 人人射人人操人人摸| 亚洲欧洲美腿丝袜| 老色鬼成人精品视频下载大在线观看| 久久超碰网| 亚洲综合精品国产一区| 蜜臀av中字字幕网站| 熟妇一区,二区,三区。| av网站国产主播在线| 亚洲精品三| 久久日本熟女精品一区| 熟女精品日韩一区二区三区 | 91天堂视频| 欧美日韩亚洲天堂| 天堂中文日本在线观看| 天堂日本亚洲欧美| 哈哈操 大香蕉| 啪啪免费| wwe 天天干.com| 国产精品乱码久久久| 日韩AV无码中文一区二区| 黄色成品网站| 亚洲黄色| 性爱精品一区| 60秒免费小视频| 88xx成人精品视频| 久久精品国产精品亚洲艾通辽熟妇| 四虎在线观看网站| 老外又粗又长一晚做五次| 夜夜爽77777| 大香蕉99re| 亚洲一区二区中文字幕| 亚州久久9| 2023天天操夜夜操| 中文字幕日韩综合| 欧美色老汉| 久久精品国产亚洲AV高级北京| 你草精品在线视频| 国产成年女黄特黄| 五月丁香六月激情| 素人伊尹大香蕉免费下载视频| 夜夜天天噜狠狠爱2021| 欧美色997| 欧美欧美啪啪视频| 91neishe| 超碰美国| 五月天伊人| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 97硬碰| av影片在线观看不卡| 亚洲天堂区| 大香蕉99999| 五月婷婷激情综合|