1. 程式人生 > >關於24點演算法的思想和程式碼實現

關於24點演算法的思想和程式碼實現

先簡單介紹一下24點遊戲:
給出4個1-9之間的自然數,其中每個數字只能使用一次;任意使用 + - * / ( ) ,構造出一個表示式,使得最終結果為24,這就是常見的算24點的遊戲。比如兩道比較經典的題目:1,5,5,5和3,3,8,8,先自己試試,答案貼在文章最後^_^

此文所貼程式碼均為面向過程的C(++)程式碼,在VC6下編譯通過。

解決這個問題一般使用窮舉法,即窮舉4個整數所有可能的表示式,然後對錶達式求值。下面的兩種思路(三種演算法)均是基於窮舉法,各有優劣。

第一種思路:
把多元運算轉化為兩元運算,先從四個數中取出兩個數進行運算,然後把運算結果和第三個數進行運算,再把結果與第四個數進行運算。在求表示式的過程中,最難處理的就是對括號的處理,而這種思路很好的避免了對括號的處理。基於這種思路有兩種演算法:

第一種演算法:
(1) 將4個整數放入陣列中,
(2) 在陣列中取兩個數字的排列,共有 P(4,2) 種排列。對每一個排列,
(2.1) 對 + - * / 每一個運算子,
(2.1.1) 根據此排列的兩個數字和運算子,計算結果,
(2.1.2) 改表陣列:將此排列的兩個數字從陣列中去除掉,將 2.1.1 計算的結果放入陣列中,
(2.1.3) 對新的陣列,重複步驟 2,
(2.1.4) 恢復陣列:將此排列的兩個數字加入陣列中,將 2.1.1 計算的結果從陣列中去除掉。

可以看出,步驟2是一個遞迴函式。當陣列中只剩下一個數字的時候,這就是表示式的最終結果,此時遞迴結束。

這個是程式程式碼,原始碼為csdn 演算法論壇前版主海星所作,我修改了部分變數。此程式只能求出第一個解,無法求出全解。

引用內容:(略有修改,VC++ 2005下測試)
 

附:

(5-(1/5))*5 = 24

8/(3-(8/3))  = 24