zoukankan      html  css  js  c++  java
  • 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;
    } 
    

      

  • 相关阅读:
    mysql、mongodb、redis区别
    Redis面试题
    【开发提效】开发提效技巧
    【代码规范】16条军规
    mysql数据库连接字符串
    mysql数据库连接字符串
    好用的api接口
    node + express + vue
    跨源资源共享(CORS)
    fehelper
  • 原文地址:https://www.cnblogs.com/mjn1/p/11808458.html
Copyright © 2011-2022 走看看