zoukankan      html  css  js  c++  java
  • 回溯法(非递归实现)

    问题:给出一些数目,可以用加减乘除计算结果,求一些满足条件的结果。例如算24点。

    简化:生成+-*/的所有可能计算方式。(貌似不是数学中的排列,也不是数学中的组合)

    求解:(非递归)回溯法。

    #include <iostream>
    using namespace std;
    
    // 0=>+, 1=>-, 2=>*, 3=>/
    int op[100];
    int count = 0;
    void output(int n)
    {
        for(int i = 0; i <= n-1; i++)
        {
            switch (op[i]) {
            case 0:
                cout << "+";
                break;
            case 1:
                cout << "-";
                break;
            case 2:
                cout << "*";
                break;
            case 3:
                cout << "/";
                break;
            default:
                cout << "error";
                break;
            }
        }
        cout << endl;
    }
    
    void init(int n)
    {
        for(int i = 0; i < n; i++)
        {
            op[i] = -1;
        }
    }
    
    void back_tracking_2(int n)
    {
        init(n);
    
        int i = 0;
        while (i >-1)
        {
            if (i == n)
            {
                count++;
                output(n);
                i--;
            }
                    
            // -1指示其状态为:未确定。
            // (0,1,2,3), 4  如有下一个解
            if (op[i]+1 < 4)
            {
                op[i]++;    // 尝试下一个解
                i++;        // 前进,扩展分支
            }
            else
            {
                op[i] = -1; // 重设分支的状态为未定
                i--;        // 回溯
            }
        }
    }
    int main()
    {
        back_tracking_2(6);
        cout << count << " solutions found!" << endl;
        return 0;
    }
  • 相关阅读:
    作业11图
    作业11
    作业10
    总结一
    物联网相关知识
    第十二次作业
    附加题4
    第十一次作业
    附加题3
    第十次作业
  • 原文地址:https://www.cnblogs.com/jiejue/p/3152383.html
Copyright © 2011-2022 走看看