93. 递归实现组合型枚举
将递归改成非递归,将递归入口改成对应的if...else...条件语句,在其中执行相同的操作
#include <iostream> #include <stack> using namespace std; int n, m; struct State { int pos, u, sum, state; }; 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: } 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; // 更新当前pos的状态,下一次在遇到它就是在pos=1的那个if分支中了 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}); } else continue; } return 0; }