首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

24 點遊戲演算法:面向過程與面向物件的 C++ 實作

     編輯:關於C++

「24 點」遊戲規則簡單:給定 4 個整數,各用一次,任意使用 + - * / ( ) 運算,構造表達式使結果等於 24。本文介紹窮舉遞迴演算法,並提供面向過程的 C++ 與面向物件的 Java 兩種實作。

核心演算法原理

表達式定義為 expression = (expression|number) operator (expression|number),所有運算子皆為二元。演算法步驟:

  1. 將 4 個數字放入陣列。
  2. 從陣列取兩數排列(P(4,2) 種),對每種排列嘗試四種運算子。
  3. 計算結果,移除兩數並將結果加入陣列,遞迴處理新陣列。
  4. 遞迴返回後恢復陣列狀態(現場保護),繼續下一種排列。
  5. 當陣列僅剩一數時,若與 24 差值小於精度(1E-6),即找到解。

括號僅影響運算優先順序,演算法中無需顯式處理,輸出時再加入括號即可。

面向過程 C++ 實作

採用雙層迴圈產生兩數排列(j = i+1 利用加法/乘法交換律減少重複),對減法/除法分別計算 a-b、b-a、a/b、b/a。使用 double 陣列存數值,string 陣列同步記錄表達式字串。遞迴函式 Search(n) 中以局部變數備份/還原陣列元素,確保現場一致性。僅輸出第一個找到的解。

面向物件 Java 實作

設計四大類別:

  • Number:封裝數值與 toString()。
  • Expression extends Number:含左右運算元與運算子,遞迴定義表達式樹。
  • Calculator:主演算法類,管理數值/表達式陣列、排列生成器 Permutor。
  • Permutor:迭代器風格產生兩元素排列,簡化流程控制。

優點:輸出格式調整只需改寫 toString();Permutor 封裝排列邏輯,擴充至三數排列僅修改內部實現;Number/Expression 可復用於表達式解析器等專案。

關鍵細節

  • 精度比較避免浮點誤差(如 (5-1/5)*5)。
  • 遞迴現場保護/恢復是正確性關鍵。
  • 面向物件版犧牲部分效能,換取結構清晰與擴充性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved