2 回答

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