❤️震惊!人生苦短,我用python来玩田忌赛马❤️
一讀標(biāo)題笑死自己哈哈哈,最近豬哥(玩得敲好的彭友)找我?guī)兔鉀Q他不會(huì)作業(yè)哈哈哈,他們公司自己出的筆試題哈哈哈,希望別被他們出題人看見哈哈哈,回想豬哥說的一句話,萬一這就是以后你遇到的試題呢哈哈哈。突然發(fā)現(xiàn)自己已經(jīng)小半年沒玩Python了,一上手手都生了,還真是那句話,三天不摸手生了都。
https://blog.csdn.net/hanhanwanghaha寶藏女孩 歡迎您的關(guān)注!
歡迎關(guān)注微信公眾號(hào):寶藏女孩的成長日記
讓這個(gè)可愛的寶藏女孩在努力的道路上與你一起同行!
如有轉(zhuǎn)載,請注明出處(如不注明,盜者必究)
關(guān)于田忌賽馬的拙見
- 使用 python 函數(shù)實(shí)現(xiàn)田忌賽馬
- 要求一
- 要求二
- 要求三
使用 python 函數(shù)實(shí)現(xiàn)田忌賽馬
要求一
現(xiàn)在我們
將田忌的馬抽象為一個(gè)列表 [2,5,8],
齊王的馬抽象為另一個(gè)列表 [3,6,9],
分別代表各自的下、中、上等馬(我自己讀到這里就記住值越大,馬越好,這樣理解就不會(huì)錯(cuò)了)。
設(shè)計(jì)一個(gè)函數(shù) race(),將兩個(gè)列表作為參數(shù)傳遞給race(),將策略抽象為代碼使田忌贏得比賽,函數(shù)返回每輪對(duì)陣情況:
上代碼
要求二
現(xiàn)在將馬分為 劣 、下、中、上、優(yōu)五等,五局三勝制,抽象為列表[2,4,6,8,10] 與 [1,3,5,7,9] ,其他條件不變(齊王仍然準(zhǔn)守規(guī)則,田忌繼續(xù)不按照套路出牌),計(jì)算出田忌有多少種贏得比賽的可能
上代碼
要求三
如果你是齊王,已知同級(jí)別中己方的馬優(yōu)于田忌的馬,事先不知道對(duì)方派遣順序,不過可以根據(jù)上一輪對(duì)方的派出的馬匹制定本輪的選擇。制定一種派遣策略,使贏得比賽的幾率最大。
第三題我是真不知道咋做了(想這個(gè)腦子都長草了!這是親爺熬夜給我想出來的,可能不是最優(yōu),需要點(diǎn)聰明腦子,如果有更好的想法可以私信我,歡迎討論)
解題思路:
田忌以劣勝優(yōu)的策略在于輸?shù)臅r(shí)候輸?shù)谋容^多,但是贏的時(shí)候只是微弱優(yōu)勢贏
如 10-1 8-9 6-7 4-5 2-3 (齊王1:田雞4)
那想讓齊王盡可能獲勝的辦法就是拉開這個(gè)「微弱優(yōu)勢」
方法
齊王第一次排出2的
往后每次分兩種情況,
1.田忌贏了,那我們就可以拿出上輪田忌的x-1的參加下一輪。
2.田忌輸了,可以繼續(xù)拿當(dāng)前最小的出來。
如果x-1的沒了,就出最差的那匹,如此循環(huán)
這種方法仍然會(huì)失敗 如田忌按照3 5 7 9 1這樣出
上代碼
# coding=utf-8from itertools import permutations from typing import *tian = [1, 3, 5, 7, 9] qi = [2, 4, 6, 8, 10]def play() -> float:global qiwin_count = 0cnt = 0for a, b, c, d, e in permutations(tian, 5):qi = [2, 4, 6, 8, 10] # 復(fù)原cnt += 1tian_rank = [a, b, c, d, e]qi_rank = [qi.pop(0)] # 初始化for index, last_tian in enumerate(tian_rank[:4]):qi_rank.append(strategy(last_tian, qi_rank[index] > tian_rank[index])) # 每次根據(jù)上一次tian的和輸贏制定策略# 根據(jù)兩個(gè)rank算輸贏win_count += winner(qi_rank, tian_rank)# 返回概率return float(win_count) / float(cnt)def strategy(last_tian: int, is_win: bool) -> int:global qi# 如果齊王上輪贏了,繼續(xù)拿最小的出來if is_win:return qi.pop(0)# 如果齊王上輪輸了else:# 如果x-1的存在,就拿出來if last_tian - 1 in qi:return qi.pop(qi.index(last_tian - 1))# 否則還是拿最小的else:return qi.pop(0)def winner(qi: List[int], tian: List[int]) -> bool:cnt = 0for q, t in zip(qi, tian):cnt += q > treturn cnt >= 3if __name__ == '__main__':print(play())這樣算出來的概率是0.075,
感覺前面兩個(gè)算法題加油扣腦殼是可以湊合寫出來的,第三個(gè)是真難度(當(dāng)然對(duì)于大佬來說小事一樁)
https://blog.csdn.net/hanhanwanghaha寶藏女孩 歡迎您的關(guān)注!
歡迎關(guān)注微信公眾號(hào):寶藏女孩的成長日記
讓這個(gè)可愛的寶藏女孩在努力的道路上與你一起同行!
如有轉(zhuǎn)載,請注明出處(如不注明,盜者必究)
總結(jié)
以上是生活随笔為你收集整理的❤️震惊!人生苦短,我用python来玩田忌赛马❤️的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Vo. 1 No. 1] 高等代数一题
- 下一篇: websocket python爬虫_p