递归改非递归

#include <iostream>
#include <stack>

using namespace std;

int n, m;

// void dfs(int u, int sum, int state)
// {
//     // 0
//     if(sum + n - u < m) return;
//     if(sum == m)
//     {
//         for(int i = 0; i < n; i++)
//             if(state >> i & 1)
//                 cout << i + 1 << " ";
//         cout << endl;
//         return;
//     }
//     dfs(u + 1, sum + 1, state | 1 << u);
//     // 1
//     dfs(u + 1, sum, state);
//     // 2
// }

struct State
{
    int pos, u, sum, state;    
};
int main()
{
    cin >> n >> m;
    // dfs(0, 0, 0);
    
    stack<State> stk;
    stk.push({0, 0, 0, 0});
    while(!stk.empty())
    {
        auto t = stk.top(); stk.pop();
        if(t.pos == 0)
        {
            if(t.sum + n - t.u < m) continue;
            if(t.sum == m)
            {
                for(int i = 0; i < n; i++)
                if(t.state >> i & 1)
                cout << i + 1 << " ";
                cout << endl;
                continue;
            }
            t.pos = 1;
            stk.push(t);
            stk.push({0, t.u + 1, t.sum + 1, t.state | 1 << t.u});
        }
        else if(t.pos == 1)
        {
            t.pos = 2;
            stk.push(t);
            stk.push({0, t.u + 1, t.sum, t.state});
        }
    }
}
posted @ 2020-11-09 16:27  ManateeFan  阅读(111)  评论(0编辑  收藏  举报