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;
} 

  

posted @ 2019-11-06 20:35  青衫客36  阅读(119)  评论(0编辑  收藏  举报