2 回答

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
最簡(jiǎn)單的就是窮舉,先把1~9的數(shù)字的三位不重的排列窮舉出來(lái),然后再給每種排列加上運(yùn)算符,窮舉出所有后綴表達(dá)式,再求值,最后去重。這是最簡(jiǎn)單,也是效率最低的方法。
然后進(jìn)一步考慮題目的特點(diǎn),不妨規(guī)定找到的數(shù)字序列前兩位優(yōu)先運(yùn)算,然后再和最后一位運(yùn)算。容得三位數(shù)要運(yùn)算得到一個(gè)結(jié)果,要且僅要兩次運(yùn)算??紤]最后一次運(yùn)算,最后一次運(yùn)算必然是四則運(yùn)算中的其中一個(gè),于是目標(biāo)轉(zhuǎn)化為窮舉出經(jīng)過(guò)一次四則運(yùn)算可以得到24的長(zhǎng)度為2的數(shù)字序列,且該序列的第二個(gè)數(shù)為1~9這9個(gè)整數(shù)中的其中一個(gè),第一個(gè)數(shù)為1~9這9個(gè)整數(shù)中除了該序列的第二個(gè)數(shù)外的兩個(gè)的運(yùn)算的結(jié)果。
比如最后一次運(yùn)算是加法,則這樣窮舉
? + 1 = 24 => 23
? + 2 = 24 => 22
? + 3 = 24 => 21
...
? + 9 = 24 => 15
最后一次運(yùn)算是減法,則這樣窮舉
? - 1 = 24 => 25
? - 2 = 24 => 26
? - 3 = 24 => 27
...
? - 9 = 24 => 33
最后一次運(yùn)算是乘法,則這樣窮舉
? * 1 = 24 => 24.0
? * 2 = 24 => 12.0
? * 3 = 24 => 8.0
...
? * 9 = 24 => 2.666666666666667
最后一次運(yùn)算是除法,則這樣窮舉
? / 1 = 24 => 24
? / 2 = 24 => 48
? / 3 = 24 => 72
...
? / 9 = 24 => 216
可以注意到,有一些結(jié)果是不可能的,例如216 / 9 = 24,就算允許重復(fù),9 * 9最多也不過(guò)81,從而兩位不同的1~9的整數(shù)的四則運(yùn)算無(wú)法達(dá)到216。
于是我們窮舉出了所有兩位1~9的整數(shù)的四則運(yùn)算可能得到的結(jié)果(有些是不可能的,可以剪枝),繼續(xù)窮舉,我們即可得到結(jié)果(會(huì)有重復(fù))
? + ? = 23 => 兩位不同的1~9的整數(shù)的加法運(yùn)算的結(jié)果最多為17,剪枝
...
? + ? = 17 => 兩位不同的1~9的整數(shù)的加法運(yùn)算的結(jié)果最多為17,可以繼續(xù)
? + 1 = 17 => 16 // 不符合題意,舍去
? + 2 = 17 => 15 // 不符合題意,舍去
...
? + 8 = 17 => 9 // 符合題意,得到序列9、8、7,運(yùn)算為(9+8)+7
? + 9 = 17 => 8 // 符合題意,但相同的序列和運(yùn)算已經(jīng)存在
...
最后還要去重,或者說(shuō)判斷當(dāng)前窮舉出來(lái)的序列和運(yùn)算是否與前面已經(jīng)得到過(guò)的序列和運(yùn)算等價(jià),這個(gè)自己寫(xiě)就好了。
24點(diǎn)牌算法是比較經(jīng)典的數(shù)據(jù)結(jié)構(gòu)與算法課程的例題,搜索一下會(huì)有更多結(jié)果,以上只是我臨時(shí)的思路,以我的水平,這一定不是最優(yōu)的解法(沒(méi)錯(cuò),我之前沒(méi)做過(guò)這題233)
技不如人,甘拜下風(fēng)
添加回答
舉報(bào)