「24點」是一種數學遊戲,正如象棋、圍棋一樣是一種人們喜聞樂見的娛樂活動。它始於何年何月已無從考究,但它以自己獨具的數學魅力和豐富的內涵正逐漸被越來越多的人們所接受。今天就為大家分享一道關於「24點」的演算法題目。第679題:24點遊戲話不多說,直接看題。
你有 4 張寫有 1 到 9 數字的牌。你需要判斷是否能通 *,/,+,-,(,) 的運算得到 24 。
示例 1:
輸入: [4, 1, 8, 7]
輸出: true
解釋: (8-4) * (7-1) = 24
示例 2:
輸入: [1, 2, 1, 2]
輸出: false
注意:
1、除法運算子 / 表示實數除法,而不是整數除法。例如 4 / (1 - 2/3) = 12 。
2、每個運算子對兩個數進行運算。特別是我們不能用 - 作為一元運算子。例如,[1, 1, 1, 1] 作為輸入時,表示式 -1 - 1 - 1 - 1 是不允許的。
3、你不能將數字連線在一起。例如,輸入為 [1, 2, 1, 2] 時,不能寫成 12 + 12 。
拿到題目,第一反應就可以想到暴力求解。如果我們要判斷給出的4張牌是否可以通過組合得到24,那我們只需找出所有的可組合的方式進行遍歷。
4個數字,3個操作符,外加括號,基本目測就能想到組合數不會大到超出邊界。所以,我們只要把他們統統列出來,不就可以進行求解了嗎?說幹就幹!
我們首先定義個方法,用來判斷兩個數的的所有操作符組合是否可以得到24。
func
judgepoint24_2
(a, b float64
)bool
但是這個方法寫的正確嗎?其實不對!因為在計算機中,實數在計算和儲存過程中會有一些微小的誤差,對於一些與零作比較的語句來說,有時會因誤差而導致原本是等於零但結果卻小於或大於零之類的情況發生,所以常用乙個很小的數1e-6代替 0,進行判讀!
(1e-6:表示1乘以10的負6次方。math.abs(x)<1e-6 其實相當於x==0。1e-6(也就是0.000001)叫做epslon,用來抵消浮點運算中因為誤差造成的相等無法判斷的情況。這個知識點需要掌握!)
舉個例子:
func
main()
這裡直接用a==0就會得到false,但是通過a < 1e-6 && a > -(1e-6)卻可以進行準確的判斷。
所以我們將上面的方法改寫:
//go語言
//judgepoint24_2:判斷兩個數的所有操作符組合是否可以得到24 func judgepoint24_2(a, b float64) bool
完善了通過兩個數來判斷是否可以得到24的方法,現在我們加乙個判斷三個數是否可以得到24的方法。
//硬核**,不服來辯!
func
judgepoint24_3
(a, b, c float64
)bool
//硬核**,不服來辯!
func
judgepoint24
(nums [
]int
)bool
我們整合全部**如下:
func
judgepoint24
(nums [
]int
)bool
func
judgepoint24_3
(a, b, c float64
)bool
func
judgepoint24_2
(a, b float64
)bool
執行結果:
由於**過於硬核,我們直接擊敗100%的對手:(沒想到吧!**還可以這麼寫~)C語言實現24點小遊戲
遊戲規則 從鍵盤輸入任意1 13的4個數,然後用算術運算子 一 將這四個數組成一乙個算術表示式 可加括號,每個數字只能使用1次 使得該式的運算結果為24,每輸入一次表示式,系統給出該式的運算結果,如果結果是24,則遊戲結束 如果不是,則繼續組合表示式,直到結果為24為止。本題最簡單的解法就是應用窮舉...
C語言實現紙牌24點小遊戲
此程式參考c語言實現經典24點紙牌益智遊戲,並做出一些改進。一 題目要求 24點遊戲規則 從撲克中每次取出4張牌。使用加減乘除,第乙個能得出24者為贏。其中,j代表11,q代表12,k代表13,a代表1 按照要求程式設計解決24點遊戲。基本要求 隨機生成4個代表撲克牌牌面的數字字母,程式自動列出所有...
Go語言實現分金幣遊戲
你有50枚金幣,需要分配給以下幾個人 matthew,sarah,augustus,heidi,emilie,peter,giana,adriano,aaron,elizabeth。分配規則如下 a.名字中每包含 e 或 e 分1枚金幣 b.名字中每包含 i 或 i 分2枚金幣 c.名字中每包含 o...