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

24 點遊戲求解器:程序式與物件導向 C++ 實現對比

     編輯:VC 教學

問題定義

給定 4 個整數,各用一次,任意使用 + - * / ( ) 構造表達式,結果為 24。經典窮舉求解問題。

核心演算法:遞迴窮舉所有二元運算樹

  1. 將 4 數放入陣列/列表。
  2. 從中取有序數對 (排列 P(n,2)),對每對嘗試 4 種運算子。
  3. 計算結果,移除該兩數,將結果放入列表 → 遞迴處理新列表。
  4. 遞迴基礎案例:列表剩 1 數,檢查是否為 24 (浮點數誤差容忍)。
  5. 回溯:恢復列表狀態,嘗試下一種運算子/數對。

括號優先序隱含於遞迴順序中,輸出時再根據運算子優先序加括號。

C 程序式實現要點

  • 陣列原地修改 + 索引操作模擬列表增減。
  • 全域/靜態變數儲存解字串。
  • 錯誤處理:除零檢查、浮點比較 fabs(a-24) < 1e-6。

C++ 物件導向實現優勢


class Expression {
    // 封裝數值與字串表示
    double value;
    std::string expr;
public:
    Expression(double v, const std::string& s) : value(v), expr(s) {}
    // 運算子多載自然表達運算邏輯
    friend Expression operator+(const Expression& a, const Expression& b) {
        return Expression(a.value + b.value, "(" + a.expr + "+" + b.expr + ")");
    }
    // ... -, *, / 同理
    bool is24() const { return std::fabs(value - 24.0) < 1e-6; }
    std::string toString() const { return expr; }
};

class Solver {
    std::vector nums;
    std::vector solutions;
    void dfs() { /* 遞迴窮舉 */ }
public:
    std::vector solve(const std::vector& input) { /* ... */ }
};

OO 優勢:
• 數值與表達式字串封裝為單一物件,避免平行陣列同步錯誤。
• 運算子多載使運算邏輯與字串構建原子化、不可分割。
• Solver 類別封裝狀態與演算法,介面乾淨,易測試、易擴充 (如支援更多運算子)。

效能優化提示

  • 剪枝:中間結果超出合理範圍 (如 > 1e6) 提前返回。
  • 去重:對交換律運算子 (+, *) 強制左運算元 ≤ 右運算元,減少重複排列。
  • 快取:記憶化子列表狀態 (狀態空間較小)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved